PostgreSQL VACUUM 진단 (dead tuple·autovacuum 확인)
브라우저 안에서만 처리됩니다. 입력한 내용과 선택한 파일은 서버로 전송되지 않습니다. 익명 방문 통계만 집계합니다.
아래 결과는 전부 검토 후보이지 결론이 아닙니다 — 누적 통계와 PostgreSQL 기본 임계값을 가정한 계산입니다(자세한 전제는 결과 위에 적습니다).
진단 SQL
복사해 psql --csv -f-(권장)로 실행하고 출력 전체를 아래에 붙여넣으세요.
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;
--csv 가 파싱이 가장 견고합니다. psql 안에서 그대로 실행한 기본(aligned) 출력도 지원합니다.
필요 권한/확장 — 확장·특수 권한 불필요 — 해당 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 설정 계산기에서 서버 사양에 맞는 권장값을 확인하세요.