나의 잡다한 노트 및 메모
PostgreSQL Vacuum 본문
PostgreSQL 테이블에서 더 이상 필요 없는(dead) 데이터를 정리하고, 저장 공간과 성능을 회복하는 작업.
PostgreSQL의 특성 (MVCC)
- PostgreSQL은 MVCC (Multi-Version Concurrency Control) 방식을 사용합니다.
- 즉, 데이터를 UPDATE하거나 DELETE하면 기존 행(row)을 **즉시 지우지 않고 “죽은 튜플(dead tuple)”**로 남겨둡니다.
- 새로운 버전의 행은 같은 테이블에 새로 기록됩니다.
- 이렇게 해야 동시에 SELECT 중인 세션이 여전히 옛 데이터를 볼 수 있기 때문입니다.
➡️ 하지만 이런 dead tuple이 무한정 쌓이면 디스크 공간 낭비 + 쿼리 성능 저하가 발생합니다.
그래서 필요할 때마다 VACUUM이 필요합니다.
VACUUM의 역할
- Dead tuple 정리
- 더 이상 어떤 트랜잭션에서도 참조하지 않는 tuple들을 테이블에서 제거
- 공간을 재사용 가능하게 표시 (즉각 파일 크기 줄이지는 않음)
- 통계/메타데이터 갱신
- 트랜잭션 ID 관리 (XID wraparound 방지)
- 힙 테이블과 인덱스에서 어떤 블록이 clean/dirty 한지 기록
- 인덱스 관리
- 인덱스에서도 필요 없는 엔트리를 청소
VACUUM 종류
- VACUUM (일반)
- dead tuple을 지워 공간을 “재사용 가능” 상태로 만듦
- 파일 크기는 그대로
- VACUUM FULL
- 테이블/인덱스를 새로 재작성(rewrite)
- 실제 디스크 파일 크기도 줄어듦
- 하지만 테이블에 Exclusive Lock을 걸기 때문에 무겁고 오래 걸림
- Autovacuum (자동 VACUUM)
- PostgreSQL에는 autovacuum 데몬이 있어 dead tuple이 일정 기준을 넘으면 자동 실행
- 보통 운영 환경에서는 이걸 끄지 않고 사용
- VACUUM = PostgreSQL의 청소부
- dead tuple을 제거하고, 공간 재활용 및 통계 갱신을 담당
- 성능과 안정성을 위해 필수적인 작업
- 운영 환경에서는 대부분 autovacuum이 자동으로 처리
'DB > PostgreSQL' 카테고리의 다른 글
| DBA가 알면 좋은 쿼리 ( SLOT ) (0) | 2025.09.03 |
|---|---|
| PostgreSQL 관리자(DBA)가 자주 쓰는 주요 테이블/뷰 (0) | 2025.08.23 |
| PostgreSQL tablespace (0) | 2025.08.22 |
| PostgreSQL Subscription (0) | 2025.08.20 |
| PostgreSQL Replication slot (0) | 2025.08.20 |