HOT (Heap-Only Tuple) update là tối ưu cho phép PostgreSQL cập nhật một dòng mà không phải đụng tới index nào. Điều kiện để HOT xảy ra:
1. UPDATE không sửa cột nào đang được đánh index, và
2. Phiên bản dòng mới nằm vừa trong cùng trang (page) với dòng cũ.
Khi đủ hai điều kiện, dòng mới được ghi cùng trang và nối với dòng cũ bằng một con trỏ nội bộ; index cũ vẫn trỏ đúng chỗ. Một UPDATE chỉ tốn một lần ghi heap thay vì heap cộng N lần ghi index.
Vì sao thêm index có thể làm sập throughput: giả sử bảng sessions có cột last_seen_at được UPDATE liên tục. Trước đây mọi update đều là HOT. Ai đó thêm CREATE INDEX ON sessions (last_seen_at) để phục vụ một báo cáo — từ đó mọi update đều sửa một cột được đánh index, HOT tắt hẳn. Hệ quả dây chuyền:
- Mỗi update ghi thêm entry vào toàn bộ index của bảng.
- WAL sinh ra nhiều hơn đáng kể.
- Index tích tụ entry chết nhanh → bloat, autovacuum phải chạy nhiều hơn.
Một index tưởng như vô hại có thể làm giảm throughput ghi nhiều lần.
Điều chỉnh:
- Tránh đánh index lên cột bị update nóng. Nếu báo cáo cần, cân nhắc tách cột đó sang bảng phụ.
- Giảm fillfactor để chừa chỗ trống trong trang cho phiên bản mới, giữ điều kiện thứ hai:
ALTER TABLE sessions SET (fillfactor = 70);- Đo bằng pg_stat_user_tables: so n_tup_upd với n_tup_hot_upd.
Tỉ lệ HOT tụt sau một lần deploy là dấu hiệu rõ ràng.