Dead tuple là phiên bản dòng đã bị UPDATE thay thế hoặc DELETE đánh dấu, nhưng không transaction nào còn cần nhìn thấy nữa. Nó vẫn nằm trong file dữ liệu cho tới khi VACUUM đánh dấu vùng đó tái sử dụng được.
Bloat là khi lượng dead tuple tích luỹ khiến bảng (và index của nó) chiếm nhiều trang đĩa hơn dữ liệu sống rất nhiều.
Ảnh hưởng:
- Sequential scan phải đọc thêm trang rỗng → chậm hơn.
- Buffer cache chứa toàn trang gần như rỗng → tỉ lệ hit giảm.
- Backup và disk usage tăng theo phần thừa.
Phát hiện:
select relname,
n_live_tup,
n_dead_tup,
last_autovacuum
from pg_stat_user_tables
order by n_dead_tup desc
limit 10;Nếu n_dead_tup lớn so với n_live_tup và last_autovacuum cũ hoặc rỗng thì bảng đó đang bloat.
Nguyên nhân thường gặp: bảng job/queue bị update liên tục, batch DELETE lớn, hoặc có transaction chạy dài giữ snapshot khiến vacuum không dọn được.