PostgreSQL VACUUM 진단 (dead tuple·autovacuum 확인)
브라우저 안에서만 처리됩니다. 입력한 내용과 선택한 파일은 서버로 전송되지 않습니다. 익명 방문 통계만 집계합니다.
아래 결과는 전부 검토 후보이지 결론이 아닙니다. dead tuple·autovacuum 횟수는 stats_reset(통계 리셋) 이후 누적입니다 — "최근 며칠간"의 활동이 아닙니다. 임계 배율은 autovacuum_vacuum_threshold=50·autovacuum_vacuum_scale_factor=0.2 라는 PostgreSQL 기본값을 가정한 계산일 뿐입니다 — 이 도구는 서버 설정을 직접 조회하지 않으므로, 이 서버가 실제로 기본값을 쓰는지는 알 수 없습니다. 설정을 바꿨다면(테이블별 storage parameter 오버라이드 포함) 실제 임계값은 다를 수 있습니다.
진단 SQL
SELECT t.schemaname AS schema_name, t.relname AS table_name, t.seq_scan AS seq_scan, t.idx_scan AS idx_scan, t.n_live_tup AS n_live_tup, t.n_dead_tup AS n_dead_tup, t.last_vacuum AS last_vacuum, t.last_autovacuum AS last_autovacuum, t.autovacuum_count AS autovacuum_count, d.stats_reset AS stats_reset FROM pg_stat_user_tables AS t CROSS JOIN (SELECT stats_reset FROM pg_stat_database WHERE datname = current_database()) AS d ORDER BY t.n_dead_tup DESC;
복사한 SQL 을 psql --csv -f-(권장 — 파싱이 가장 견고합니다)로 실행하거나,
psql 안에서 그대로 실행한 기본 출력도 지원합니다. 출력 전체를 아래에 붙여넣으세요.
필요 권한/확장 — 확장·특수 권한 불필요 — 해당 DB 접속 권한이면 조회 가능(카탈로그 기본 접근).
pgindex(seq_scan·idx_scan) 와 pgvacuum(n_live_tup·n_dead_tup·last_(auto)vacuum·autovacuum_count) 이 이 SQL 하나를 같이 씁니다. stats_reset 은 DB 전체 기준이라 테이블별 리셋 시각이 아닙니다 — 초기화 직후처럼 리셋이 없었던 DB 에서는 비어 있을 수 있습니다.
사용법
- SQL 카드의 복사 버튼으로 진단 SQL(pg_stat_user_tables 조회)을 복사합니다.
- 복사한 SQL 을 psql 에서 그대로 실행합니다 — psql --csv -f- 를 권장하지만, 기본 실행 결과도 지원합니다.
- 출력 전체를 아래 textarea 에 붙여넣으면 dead 비율 상위 순으로 정렬되어, autovacuum 기본 임계 대비 배율과 마지막 (auto)vacuum 시점이 함께 나옵니다.
자주 묻는 질문
dead tuple 이 뭔가요?
UPDATE·DELETE 로 더는 보이면 안 되는 행이지만, PostgreSQL 의 MVCC 구조상 다른 트랜잭션이 아직 볼 수도 있어 즉시 지워지지 않고 남아있는 행입니다. VACUUM(수동 또는 autovacuum)이 이 dead tuple 을 정리해 공간을 재사용 가능하게 만듭니다 — 정리되지 않고 쌓이면 테이블·인덱스가 불필요하게 커지고 스캔이 느려질 수 있습니다.
임계 배율은 어떻게 계산하고, 어디까지 믿을 수 있나요?
PostgreSQL 공식 문서(routine-vacuuming)가 정의하는 "vacuum threshold = vacuum base threshold + vacuum scale factor × number of tuples" 식에, 두 설정의 기본값(autovacuum_vacuum_threshold=50, autovacuum_vacuum_scale_factor=0.2 — runtime-config-autovacuum 문서)을 그대로 대입해 n_dead_tup 이 이 임계의 몇 배인지 보여드립니다. 다만 이 도구는 서버에 접속해 실제 설정값을 조회하지 않으므로, 이 서버가 기본값을 바꿨다면(전역 설정이든 테이블별 storage parameter 든) 실제 임계값은 다를 수 있습니다 — "몇 배"는 항상 기본값 가정 하의 참고치입니다.
VACUUM FULL 을 돌려도 되나요?
일반 VACUUM 은 테이블에 접근하는 다른 세션과 동시에 실행할 수 있지만, VACUUM FULL 은 테이블 전체에 배타적 잠금(ACCESS EXCLUSIVE)을 걸고 테이블을 통째로 다시 씁니다 — 그동안 해당 테이블에 대한 조회·쓰기가 전부 대기합니다. 운영 중인 큰 테이블에는 함부로 실행하지 말고, 정말 필요하다면 트래픽이 적은 시간대에 계획을 세워 실행하세요.
autovacuum 설정 자체를 조정하고 싶어요.
shared_buffers 같은 서버 설정값 계산은 이 도구 범위가 아닙니다 — PostgreSQL 설정 계산기에서 서버 사양에 맞는 권장값을 확인하세요.