Dead tuple 누적 이유
PostgreSQL MVCC 설계가 모든 UPDATE 가 새 행 버전 생성 + 옛거 죽었다 표시. Dead tuple 이 그냥 사라질 수 없음 — 옛 트랜잭션이 아직 보고 있을 수도. 어느 트랜잭션도 더 필요 없을 때 garbage; VACUUM 이 garbage collector.
VACUUM 이 실제 하는 일
- Dead tuple 을 재사용 가능 공간으로 표시 (일반 VACUUM).
- visibility map 갱신 → index-only scan 활성화.
- ANALYZE 와 결합 시 통계 갱신.
- VACUUM FULL 이 전체 테이블 재작성 → 디스크에서 실제 축소 — 테이블 lock; 거의 불필요.
Autovacuum 이 default + 보통 맞음
Autovacuum 데몬이 주기적으로 깨서 dead-tuple 비율이 임계값 초과하면 테이블 vacuum. 대부분 워크로드에 default 두는 게 맞음. Hot 테이블에서 default 가 under-vacuum 하면 (테이블별로 autovacuum_vacuum_scale_factor 낮춤) 보정.
Vacuum 문제 발견하는 법
pg_stat_user_tables 의 n_dead_tup 이 백만 단위면 autovacuum 못 따라잠. 테이블이 autovacuum 정리보다 빠르게 update 되거나, 긴 트랜잭션이 autovacuum 막음.