DBAtlas · 데이터베이스 운영 아틀라스

오래된 통계를 가진 테이블 찾기(ANALYZE 전략)

PostgreSQL유지보수

명령어

SELECT schemaname,
       relname AS table_name,
       n_live_tup,
       n_mod_since_analyze,
       round(100.0 * n_mod_since_analyze / NULLIF(n_live_tup, 0), 1) AS mod_pct,
       greatest(last_analyze, last_autoanalyze) AS last_analyzed,
       round(current_setting('autovacuum_analyze_threshold')::int
             + current_setting('autovacuum_analyze_scale_factor')::numeric * n_live_tup) AS autoanalyze_at
FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 0
ORDER BY mod_pct DESC NULLS LAST
LIMIT 20;

-- After a bulk load, without waiting for autovacuum
ANALYZE (VERBOSE) orders;

하는 일

마지막 ANALYZE 이후 수정된 행 수, live 행 대비 비율, autovacuum이 ANALYZE를 트리거하는 대략적인 수정 임계값을 보여 준다.

사용 시점

대량 적재/삭제 후, 계획에 잘못된 행 추정이 보일 때, 또는 대형 테이블에서 autoanalyze가 뒤처지는 것으로 의심될 때.

주의

계산된 임계값은 전역 설정을 사용한다. 테이블별 autovacuum_analyze_* reloption(pg_class.reloptions)이 있으면 실제 임계값은 다르다. 대형 테이블에서는 기본 scale_factor(0.1)가 너무 늦게 트리거되므로 테이블별로 낮춘다. autovacuum은 파티션 테이블의 부모를 ANALYZE하지 않으므로 부모 수준 통계에는 수동 ANALYZE가 필요하다. 임시 테이블은 autovacuum이 보지 못한다. ANALYZE는 샘플을 읽으며 ShareUpdateExclusiveLock을 잡는다(DML을 블로킹하지 않음).

DBAtlas에서 열기 →

관련 항목