Cơ sở dữ liệu 22/09/2026 5 phút

Bloat trong PostgreSQL: bảng phình vì dòng chết, cách phát hiện và dọn

DELETE và UPDATE để lại dòng chết; VACUUM biến chúng thành chỗ trống nhưng file không nhỏ lại — đó là bloat. Đo thật: xóa 95% dòng nhưng file vẫn 269 MB, và bảng bloat đọc chậm 3,7 lần vì quét cả trang trống. Cách phát hiện bằng pgstattuple và dọn từ VACUUM FULL tới pg_repack. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 6 phút

Transaction ID wraparound trong PostgreSQL: hiểm họa 32-bit và VACUUM freeze

Transaction id là số 32-bit, cửa sổ dùng được chỉ khoảng 2 tỉ. Nếu dòng cũ không được freeze trước khi bộ đếm tràn, chúng bỗng trông như tương lai và biến mất — thảm họa. Đo thật cách theo dõi age(datfrozenxid) và vì sao VACUUM bắt buộc kể cả bảng chỉ đọc. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

maintenance_work_mem trong PostgreSQL: RAM cho VACUUM và CREATE INDEX

maintenance_work_mem là RAM cho VACUUM, CREATE INDEX, REINDEX — tách khỏi work_mem và đặt cao hơn được. Đo thật: đủ RAM giữ danh sách dead tuple thì VACUUM chỉ quét index 1 lần thay vì 58 lần; nhưng tác dụng lên CREATE INDEX lại khiêm tốn. Cách đặt an toàn. PostgreSQL 16.

Cơ sở dữ liệu 22/09/2026 5 phút

Giao dịch dài giữ bloat: vì sao một tab quên đóng làm phình cả bảng PostgreSQL

Một giao dịch mở lâu giữ xmin horizon, khiến VACUUM không xóa được dead tuple mới hơn nó — kể cả dead tuple do giao dịch khác tạo. Đo thật: bảng phình từ 3,5 MB lên 14 MB với 300k dead tuple không dọn được trong khi một giao dịch REPEATABLE READ còn mở; đóng nó thì VACUUM dọn sạch ngay. Cách tìm thủ phạm và phòng tránh. PostgreSQL 16.