본문 바로가기
Database2026년 6월 14일2분 읽기

PostgreSQL 테이블이 계속 커진다 — VACUUM과 부풀음

YS
김영삼
조회 1050
PostgreSQL 테이블이 계속 커진다 — VACUUM과 부풀음

핵심 요약

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

아직 댓글이 없습니다.
Ctrl+Enter로 등록