핵심 요약
Postgres는 MVCC라 UPDATE·DELETE가 옛 행을 "죽은 튜플"로 남긴다. autovacuum이 이를 정리해 공간을 재사용하게 하는데, 갱신이 잦은 테이블은 부풀음(bloat)이 쌓여 느려진다. 평소엔 autovacuum 튜닝으로, 심하면 VACUUM·인덱스 재생성으로 잡는다.
1. 진단
-- 죽은 튜플 비율 확인
SELECT relname, n_dead_tup, n_live_tup
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;
2. 대응
| 상황 | 조치 |
|---|---|
| 일상 정리 | autovacuum이 자동 — 임계값 튜닝 |
| 공간 회수까지 | VACUUM(잠금 약함) |
| 심한 부풀음 | VACUUM FULL(테이블 잠금) 또는 pg_repack |
3. 함정
VACUUM FULL은 테이블 전체를 잠근다 — 운영 중엔 pg_repack 권장- autovacuum을 끄지 말 것 — 트랜잭션 ID 소진(wraparound) 위험
- 대량 UPDATE 후엔 인덱스도 부풀어 REINDEX가 필요할 수 있다
자주 묻는 질문
DELETE했는데 디스크가 안 줄어요.
죽은 튜플로 남아 공간이 즉시 반환되지 않습니다. VACUUM이 공간을 재사용 가능하게 만들지만 OS로 반환하려면 VACUUM FULL이나 pg_repack이 필요합니다.
autovacuum이 있는데 왜 부풀죠?
갱신량이 임계값을 자주 넘기면 따라가지 못합니다. 해당 테이블의 autovacuum 스케일 팩터를 낮춰 더 자주 돌게 튜닝하세요.

댓글 0