C.W.K.
Stream
Lesson 07 of 10 · published

VACUUM 과 Autovacuum 평범한 말로

~14 min · operations, vacuum

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

Dead tuple 누적 이유

PostgreSQL MVCC 설계가 모든 UPDATE 가 새 행 버전 생성 + 옛거 죽었다 표시. Dead tuple 이 그냥 사라질 수 없음 — 옛 트랜잭션이 아직 보고 있을 수도. 어느 트랜잭션도 더 필요 없을 때 garbage; VACUUM 이 garbage collector.

VACUUM 이 실제 하는 일

  • Dead tuple 을 재사용 가능 공간으로 표시 (일반 VACUUM).
  • visibility map 갱신 → index-only scan 활성화.
  • ANALYZE 와 결합 시 통계 갱신.
  • VACUUM FULL 이 전체 테이블 재작성 → 디스크에서 실제 축소 — 테이블 lock; 거의 불필요.

Autovacuum 이 default + 보통 맞음

Autovacuum 데몬이 주기적으로 깨서 dead-tuple 비율이 임계값 초과하면 테이블 vacuum. 대부분 워크로드에 default 두는 게 맞음. Hot 테이블에서 default 가 under-vacuum 하면 (테이블별로 autovacuum_vacuum_scale_factor 낮춤) 보정.

Vacuum 문제 발견하는 법

pg_stat_user_tablesn_dead_tup 이 백만 단위면 autovacuum 못 따라잠. 테이블이 autovacuum 정리보다 빠르게 update 되거나, 긴 트랜잭션이 autovacuum 막음.

Code

Dead-tuple 카운트 검사·sql
SELECT relname, n_live_tup, n_dead_tup,
       round(100.0 * n_dead_tup / nullif(n_live_tup + n_dead_tup, 0), 1) AS dead_pct,
       last_autovacuum, last_autoanalyze
FROM   pg_stat_user_tables
ORDER  BY n_dead_tup DESC
LIMIT  20;
수동 vacuum (모던 PG 에선 거의 불필요)·sql
-- Light vacuum: 공간 회수, lock 없음
VACUUM (VERBOSE, ANALYZE) orders;

-- Aggressive: 디스크에서 테이블 재작성 + 축소
-- ACCESS EXCLUSIVE lock — maintenance window 없이 prod 절대 금지
VACUUM FULL orders;
Hot 테이블의 autovacuum 튜닝·sql
-- Default 20% 대신 5% 행 dead 면 autovacuum 실행
ALTER TABLE hot_orders
SET (autovacuum_vacuum_scale_factor = 0.05,
     autovacuum_analyze_scale_factor = 0.02);

External links

Exercise

pg_stat_user_tables 검사 → 테이블의 dead-tuple 비율. dead_pct > 30% 인 거 식별. 조사: long-running 트랜잭션? autovacuum 튜닝? 한 corrective action.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.