
PostgreSQL은 MVCC (다중 버전 동시성 제어, Multi-Version Concurrency Control) 를 사용하는 데이터베이스입니다. MVCC는 트랜잭션 간 충돌을 줄이고, 읽기/쓰기 작업을 동시에 처리할 수 있게 도와주만 삭제되거나 수정된 행(데이터)도 물리적으로는 즉시 삭제되지 않습니다. 즉, UPDATE/DELETE가 발생하면 기존 행은 그대로 남고, 새로운 버전의 행이 추가될 뿐입니다. 그 결과 불필요한 죽은 튜플(dead tuples)이 테이블에 계속 쌓이고 성능 저하, 디스크 공간 낭비로 이어집니다. 이러한 문제를 해결해주는 것이 VACUUM 작업입니다.
| 역할 | 설명 |
|---|---|
| 죽은 튜플 제거 | DELETE나 UPDATE로 필요 없어진 행 삭제 |
| 디스크 공간 재사용 가능 | 디스크를 줄이는 게 아니라, 공간을 재사용 가능하게 만듦 |
| 트랜잭션 ID wraparound 방지 | 오래된 트랜잭션 ID로 인한 문제 예방 |
| 통계 수집 (ANALYZE) | 실행계획 최적화를 위한 테이블/컬럼 통계 수집 (autovacuum 포함 시) |
| 종류 | 설명 | 주요 특징 |
|---|---|---|
VACUUM | 기본 정리 | 오래된 튜플 제거, 공간은 재사용만 가능 |
VACUUM FULL | 강제 압축 | 테이블 자체를 다시 작성 → 디스크 절감 가능, Exclusive Lock 발생 |
ANALYZE | 통계만 갱신 | 실행계획 최적화를 위한 통계 수집 |
VACUUM ANALYZE | 정리 + 통계 | 정리도 하고 통계도 수집 |
-- 일반적인 사용 예
VACUUM ANALYZE;
PostgreSQL에서는 백그라운드 프로세스로 autovacuum이 자동 수행됩니다.
특정 기준을 넘어서면 autovacuum이 자동으로 동작하여 테이블을 청소합니다.
autovacuum_vacuum_threshold, autovacuum_vacuum_scale_factor 등으로 조정 가능SELECT * FROM pg_stat_user_tables WHERE last_autovacuum IS NOT NULL;
postgresql.conf)autovacuum = on
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_vacuum_scale_factor = 0.2
| 주의할 점 | 설명 |
|---|---|
VACUUM FULL은 락 발생 | 시스템에 부하 줄 수 있으므로 신중히 사용 |
| Autovacuum도 부족할 수 있음 | 대량 수정이 많은 테이블은 수동 VACUUM 필요 |
| 인덱스도 같이 VACUUM 대상 | 단, Bloat가 심할 땐 REINDEX 필요 |
-- pg_stat_user_tables: vacuum, analyze 시간 확인
SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables;
-- autovacuum 진행 중 프로세스 보기
SELECT * FROM pg_stat_activity WHERE query LIKE '%vacuum%';