🔍 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

'🗄️ DB_이야기 > # 🐘 PostgreSQL' 카테고리의 다른 글
| 🐘 [PostgreSQL] PostgreSQL 17 고가용성(HA) 이중화 설치 가이드(2) (4) | 2025.07.17 |
|---|---|
| 🐘 [PostgreSQL] PostgreSQL 17 고가용성(HA) 이중화 설치 가이드(1) (0) | 2025.07.16 |
| 🐘 [PostgreSQL] PostgreSQL의 핵심 개념, MVCC란? (1) | 2025.07.10 |
| 🐘 [PostgreSQL] SQL 처리 과정 (0) | 2025.07.10 |
| 🐘 [PostgreSQL] 전반적인 아키텍처 & 동작 흐름 정리 (1) | 2025.07.10 |
