Hai lệnh giải quyết hai việc khác nhau.
VACUUM (và autovacuum): đánh dấu không gian dead tuple là tái sử dụng được cho chính bảng đó. File trên đĩa hầu như không nhỏ lại. Chỉ lấy SHARE UPDATE EXCLUSIVE — SELECT, INSERT, UPDATE, DELETE vẫn chạy bình thường.
VACUUM FULL: viết lại toàn bộ bảng sang file mới, bỏ hết khoảng trống, rồi hoán đổi. Đĩa thực sự được trả về hệ điều hành. Nhưng nó lấy ACCESS EXCLUSIVE lock trên bảng suốt thời gian chạy — mọi truy vấn, kể cả SELECT, đều bị chặn cho tới khi xong.
Chi phí thực tế:
- Cần dung lượng trống bằng khoảng kích thước bảng để dựng bản sao.
- Bảng vài trăm GB có thể khoá hàng chục phút đến hàng giờ.
- Lock chờ ở đầu hàng đợi sẽ chặn luôn các truy vấn đến sau, kể cả khi truy vấn đó chỉ cần lock nhẹ.
Cách thay thế khi phải giảm dung lượng trên hệ thống đang chạy: dùng pg_repack (viết lại bảng qua trigger, chỉ khoá ngắn lúc hoán đổi), hoặc thiết kế lại theo partition rồi DROP/DETACH partition cũ thay vì DELETE hàng loạt.