Vaccum 메커니즘 설명

nTels_Tarzan·2025년 4월 24일
post-thumbnail

PostgreSQL의 VACUUM 메커니즘


VACUUM이 필요한 이유

PostgreSQL은 MVCC (다중 버전 동시성 제어, Multi-Version Concurrency Control) 를 사용하는 데이터베이스입니다. MVCC는 트랜잭션 간 충돌을 줄이고, 읽기/쓰기 작업을 동시에 처리할 수 있게 도와주만 삭제되거나 수정된 행(데이터)도 물리적으로는 즉시 삭제되지 않습니다. 즉, UPDATE/DELETE가 발생하면 기존 행은 그대로 남고, 새로운 버전의 행이 추가될 뿐입니다. 그 결과 불필요한 죽은 튜플(dead tuples)이 테이블에 계속 쌓이고 성능 저하, 디스크 공간 낭비로 이어집니다. 이러한 문제를 해결해주는 것이 VACUUM 작업입니다.


VACUUM의 역할

역할설명
죽은 튜플 제거DELETE나 UPDATE로 필요 없어진 행 삭제
디스크 공간 재사용 가능디스크를 줄이는 게 아니라, 공간을 재사용 가능하게 만듦
트랜잭션 ID wraparound 방지오래된 트랜잭션 ID로 인한 문제 예방
통계 수집 (ANALYZE)실행계획 최적화를 위한 테이블/컬럼 통계 수집 (autovacuum 포함 시)

VACUUM 종류

종류설명주요 특징
VACUUM기본 정리오래된 튜플 제거, 공간은 재사용만 가능
VACUUM FULL강제 압축테이블 자체를 다시 작성 → 디스크 절감 가능, Exclusive Lock 발생
ANALYZE통계만 갱신실행계획 최적화를 위한 통계 수집
VACUUM ANALYZE정리 + 통계정리도 하고 통계도 수집
-- 일반적인 사용 예
VACUUM ANALYZE;

Autovacuum (자동 VACUUM)

PostgreSQL에서는 백그라운드 프로세스로 autovacuum이 자동 수행됩니다.

특정 기준을 넘어서면 autovacuum이 자동으로 동작하여 테이블을 청소합니다.

Autovacuum 작동 기준 (예시)

  • 테이블 튜플 수의 20% 이상 변경
  • 일정 시간이 지남
  • 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 관련 주의사항

주의할 점설명
VACUUM FULL은 락 발생시스템에 부하 줄 수 있으므로 신중히 사용
Autovacuum도 부족할 수 있음대량 수정이 많은 테이블은 수동 VACUUM 필요
인덱스도 같이 VACUUM 대상단, Bloat가 심할 땐 REINDEX 필요

VACUUM 상태 모니터링

-- 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%';

profile
안녕하세요. 엔텔스 TarzanDB 공식계정입니다.

0개의 댓글