본문 바로가기
🗄️ DB_이야기/# 🐘 PostgreSQL

🐘 [PostgreSQL] Vacuum

by gwon_s 2025. 7. 11.

🔍 VACUUM이란?

PostgreSQL은 MVCC (Multi Version Concurrency Control) 기반의 데이터베이스입니다.

이게 무슨 말이냐면, 데이터를 삭제하거나 수정해도 실제로는 즉시 지우지 않고, 새로운 버전을 만들어냅니다.

 

덕분에 동시성 처리가 빠르고 안전하지만 👉 시간이 지나면 죽은 튜플(dead tuples) 이 쌓이게 됩니다.

 

바로 이 죽은 튜플을 정리해주는 작업이 VACUUM입니다!

 

*VACUUM 설명 전 이해를 돕기 위해 PostgreSQL MVCC 동작에 대한 포스팅부터 보고오면 이해하기 더 쉽습니다.

 

🐘 [PostgreSQL] 전반적인 아키텍처 & 동작 흐름 정리

🔍 들어가며PostgreSQL은 안정성과 확장성이 뛰어난 오픈소스 RDBMS입니다.하지만 처음 접할 땐 내부 구조가 어떻게 구성되어 있는지 감이 잘 안 잡히죠.이번 글에서는 PostgreSQL 17의 전체적인 아키

gwon-s.tistory.com

 


 

💥 왜 VACUUM이 중요한가요?

이유 설명
💽 디스크 공간 낭비 방지 삭제된 데이터가 쌓이면 실제 디스크 용량만 차지
🚀 성능 유지 쿼리가 불필요한 죽은 데이터까지 읽게 되면 성능 저하
🧨 트랜잭션 ID wraparound 방지 오래된 트랜잭션 ID가 유지되면 DB 자체가 중단될 수도 있음!

 

 


 

🛠️ VACUUM 사용 방법

✅ 수동 VACUUM

-- 모든 테이블 Dead Tuple 정리
VACUUM;

-- 특정 테이블만 Dead Tuple 정리
VACUUM 테이블명;
  • Dead Tuple(죽은 레코드)만 정리.
  • 디스크 공간은 반환하지 않아서 테이블 파일 크기는 그대로 유지.
  • Autovacuum도 이 방식을 사용

 

 

-- 모든 테이블 Dead Tuple 정리 + 처리 내용 상세 출력
VACUUM FULL ANALYZE;
  • Dead Tuple 정리 + 디스크 공간 반환
  • 테이블을 통째로 재작성  👉  사용하지 않는 공간까지 제거
  • Exclusive Lock(배타적 락)발생  👉  실행 중 해당 테이블 접근 불가
  • 통계 정보 갱신

 

 

-- 모든 테이블 Dead Tuple 정리 + 통계 분석
VACUUM ANALYZE;

-- 특정 테이블 Dead Tuple 정리 + 통계 분석
VACUUM ANALYZE 테이블명;
    • VACUUM 이후, 테이블에 대해 통계 정보 수집  👉  Planner가 최적 실행 계획을 세울 때 참고
    • 사용 시기
      • 데이터 변경량이 많았던 테이블에서 쿼리 성능 최적화가 필요할 때
      • VACUUM과 ANALYZE를 한 번에 처리하고 싶을 때

 

 

  •  
-- 모든 테이블 Dead Tuple 정리 + 통계 정보 업데이트 + 처리 내용 상세 출력
VACUUM VERBOSE ANALYZE;

-- 특정 테이블 Dead Tuple 정리 + 통계 정보 업데이트 + 처리 내용 상세 출력
VACUUM VERBOSE ANALYZE 테이블명;

 

  • VACUUM이 실제로 잘 작동하고 있는지 확인할 때 사용

         👉  어느 테이블에서 얼마나 많은 dead tuple이 제거되었는지 알 수 있음

         👉   VACUUM이 오래 걸리는 이유를 로그로 확인 가능

 

 

 

-- 모든 테이블의 오래된 xmin값을 고정값으로 설정
VACUUM FREEZE;

-- 특정 테이블의 오래된 xmin값을 고정값으로 설정
VACUUM FREEZE test_freeze;

 

  • 오랫동안 변경되지 않은 값의 xmin을 고정시킴
    • frezze_min_age, freeze_table_age 설정값과 현재 XID를 기준으로 오래된 값 인지 판단
    • postgresql.conf 에서 설정 가능
  • 유효성 검사 시 동결된 xmin은 항상 유효로 간주 

 


✅ 자동 VACUUM

Autovacuum은 autovacuum launcher 프로세스에 의해 vacuum이 처리됩니다.

Autovacuum은 postgresql.conf 파일에서 파라미터 값을 설정하여 테이블 단위, 전체 데이터베이스를 설정할 수 있습니다.

* Autovacuum은 디스크 공간을 반환하지 않습니다.

 

🔧 postgresql.conf 파일 내 Autovacuum 관련 주요 설정

파라미터명 기본값 의미
autovacuum on 자동 vacuum 사용 여부
autovacuum_vacuum_threshold 50 최소 dead tuple 수
autovacuum_vacuum_scale_factor 0.2 테이블 행 수 대비 dead tuple 비율
autovacuum_naptime 1min 각 테이블을 스캔하는 주기
autovacuum_freeze_max_age 200 million 트랜잭션 ID wraparound 방지 위한 freeze 기준

 * vacuum 발생 기준 = autovacuum_vacuum_threshold + (autovacuum_vacuum_scale_factor × 테이블 행 개수)                          👉  테이블에 1,000개의 행이 있다고 가정하면

                vacuum 발생 기준 = 50 + (0.2 × 1,000) = 50 + 200 = 250개

                즉, dead tuple이 250개 이상 쌓였을 때 autovacuum이 실행됩니다.

 

-- 최소 Dead Tuple 50건 이상 & 테이블 크기 대비 dead tuple 비율이 0.2 이상일때 수행
$ vi /etc/postgresql/17/main/postgresql.conf
...

#------------------------------------------------------------------------------
# AUTOVACUUM
#------------------------------------------------------------------------------

autovacuum = on                
#autovacuum_naptime = 1min              
#autovacuum_vacuum_threshold = 50       
#autovacuum_vacuum_scale_factor = 0.2 
#autovacuum_freeze_max_age = 200000000

...


-- 변경 내용 적용
$PG_HOME/bin/pg_ctl reload -D $PGDATA

postgresql.conf 파일