PostgreSQL
강의
#6 - PostgreSQL VACUUM (배큠) - ‘청소’이자 ‘건강검진’이다.
중년개발자
@loxo
17일 전
24

PostgreSQL VACUUM 가이드
🔊 발음: VACUUM = [배큠] / [배큐엄] (실무에서는 보통 배큠)
VACUUM은 PostgreSQL에서 ‘청소’이자 ‘건강검진’이다.
언제 실행되는지, 안 하면 뭐가 문제인지, 운영자는 무엇만 챙기면 되는지
완전 초보 관점에서 설명한다.
1️⃣ VACUUM은 왜 필요한가?
지난 강의에서 CTID는 row의 물리적 주소이며, UPDATE 시 새로운 CTID로 이동한다는 것을 배웠다. 이 흐름의 연장선에서 이해해야 할 핵심이 바로 다음 문장이다.
PostgreSQL은 UPDATE / DELETE 시 바로 지우지 않는다.
- UPDATE → 기존 row는 Dead Tuple
- DELETE → 바로 제거 ❌, 죽음 표시만
📌 핵심
VACUUM이 없으면 테이블은 계속 비대해진다.
2️⃣ VACUUM은 언제 실행될까?
✅ 1. 자동 실행 (Autovacuum)
PostgreSQL에는 기본적으로 autovacuum 데몬이 있다.
- 주기적으로 테이블 상태 감시
- Dead Tuple이 일정 비율을 넘으면 자동 실행
기본 조건 (개념적으로):
변경된 row 수 > (테이블 크기 × 임계치)
📌 대부분의 경우 아무 설정 안 해도 자동으로 돈다
✅ 2. 수동 실행 (운영자가 직접)
sql
VACUUM table_name;
VACUUM ANALYZE table_name;언제 쓰나?
- 대량 DELETE 후
- 배치 작업 직후
- 성능이 갑자기 나빠졌을 때
3️⃣ VACUUM이 실제로 하는 일
VACUUM은 데이터를 지우는 게 아니라 정리한다.
✔ 디스크 파일 크기를 줄이지는 않음
✔ 내부 Free Space를 다시 쓸 수 있게 만듦
4️⃣ VACUUM vs VACUUM FULL (중요 차이)
| 구분 | VACUUM | VACUUM FULL |
|---|---|---|
| Lock | 거의 없음 | 테이블 전체 Lock |
| 공간 재사용 | 내부만 | OS 레벨까지 반환 |
| 운영 중 사용 | ✅ | ❌ (점검 시간) |
▶ 실행 명령어 예시
sql
-- 일반 VACUUM (운영 중 안전)
VACUUM table_name;
-- 통계까지 함께 갱신 (가장 많이 사용)
VACUUM ANALYZE table_name;
-- 디스크 공간까지 실제로 줄이고 싶을 때 (주의!)
VACUUM FULL table_name;▶ VACUUM FULL을 쓰기 전 반드시 알아야 할 점
- 실행 중 해당 테이블 전체 LOCK
- 다른 트랜잭션 읽기/쓰기 전부 대기
- 테이블을 새로 써서 물리적으로 재구성
📌 실무 원칙
VACUUM FULL은 최후의 수단이며, 반드시 점검 시간에만 사용
5️⃣ ANALYZE는 뭐 하는 놈인가?
sql
VACUUM ANALYZE;- 테이블 통계 정보 갱신
- 옵티마이저가 실행 계획 선택에 사용
📌 포인트
VACUUM은 청소, ANALYZE는 똑똑하게 만들기
6️⃣ Autovacuum을 끄면 안 되는 이유
❗ Autovacuum 비활성화 = 서서히 망하는 DB
7️⃣ 초보 운영자를 위한 최소 유지보수 전략
✅ 반드시 지킬 5가지
- Autovacuum 끄지 말 것
- UPDATE/DELETE 많은 테이블은 모니터링
- 배치 후
VACUUM ANALYZE - 테이블 크기 급증 시 원인 분석
- VACUUM FULL은 점검 시간에만
8️⃣ 자주 나오는 초보 질문
Q. VACUUM 안 하면 데이터 날아가요?
❌ 아니요. 성능만 점점 나빠집니다.
Q. 매일 VACUUM 돌려야 하나요?
❌ Autovacuum이 대부분 처리합니다.
Q. 디스크 용량은 왜 안 줄어요?
➡ PostgreSQL은 재사용을 우선합니다.
🔚 한 줄로 정리
VACUUM은 안 하면 바로 터지진 않지만, 안 하면 반드시 망가진다.
이걸 이해하면
- Autovacuum 설정
- 대용량 테이블 운영
- 성능 튜닝
이제 “감”이 아니라 “이유”로 판단할 수 있다.
목차
- #1 - 처음 만드는 PostgreSQL 프로젝트 DB 생성 및 실행문 까지
- #2 - 실무적인 입장에서 대용량 처리 테이블 생성
- #3 - WSL에서 시작하는 실전 PostgreSQL 17 + Redis 개발환경 구축, 강의용 데이터 구축
- #4 - PostgreSQL WAL · INSERT · SELECT · 디스크 관계 정리
- #5 - PostgreSQL Heap Page(8KB)와 CTID - 이해가 쉬운 설명
- #6 - PostgreSQL VACUUM (배큠) - ‘청소’이자 ‘건강검진’이다.
- #7 - PgBouncer로 이해하는 대규모 PostgreSQL 커넥션 풀링
- #8 - PgBouncer 실전 운영 챕터 - Spring Boot 읽기·쓰기 분리 전략
- #9 - WSL PostgreSQL 17 Master-Replica 구축 가이드
#PostgreSQL#VACUUM#Autovacuum#데이터베이스 관리#튜닝
댓글 0
Ctrl + Enter를 눌러 등록할 수 있습니다※ AI 다듬기는 내용을 정제하는 보조 기능이며, 최종 내용은 사용자가 확인해야 합니다.