Do MVCC, UPDATE/DELETE không xóa dữ liệu ngay mà để lại dead tuple (phiên bản hàng cũ không còn transaction nào thấy). Tích lại gây bloat (bảng/index tăng kích thước dư thừa, chậm dần). VACUUM là tiến trình dọn dẹp:
- VACUUM (thường): thu hồi không gian dead tuple để tái sử dụng trong bảng (không trả lại OS), cập nhật visibility map (giúp index-only scan), và ngăn transaction ID wraparound (đóng băng tuple cũ).
- VACUUM FULL: nén bảng, trả lại không gian cho OS, nhưng khóa bảng độc quyền và chậm → dùng hạn chế.
- ANALYZE: cập nhật thống kê cho planner (thường chạy kèm autovacuum).
Autovacuum chạy tự động theo ngưỡng thay đổi. Không vacuum định kỳ → bloat nặng, truy vấn chậm, nguy cơ wraparound gây dừng ghi. Hay bị hỏi cùng với "vì sao Postgres cần VACUUM còn nhiều DB khác thì không".