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

visibility map 적용 범위 및 Index Only Scan 효율 확인

PostgreSQL유지보수

명령어

-- Tables with a low all-visible page ratio: Index Only Scans must visit the heap
SELECT c.oid::regclass AS table_name,
       c.relpages,
       c.relallvisible,
       round(100.0 * c.relallvisible / NULLIF(c.relpages, 0), 1) AS all_visible_pct,
       pg_size_pretty(pg_relation_size(c.oid)) AS heap_size,
       s.n_ins_since_vacuum,
       s.last_autovacuum
FROM pg_class c
JOIN pg_stat_user_tables s ON s.relid = c.oid
WHERE c.relpages > 1000
ORDER BY all_visible_pct NULLS FIRST
LIMIT 20;

-- If "Heap Fetches" in the plan is close to the returned rows, the visibility map is stale
EXPLAIN (ANALYZE, BUFFERS) SELECT id FROM customer WHERE id BETWEEN 1 AND 50000;

-- Exact count (pg_visibility extension)
CREATE EXTENSION IF NOT EXISTS pg_visibility;
SELECT * FROM pg_visibility_map_summary('customer');

하는 일

테이블의 all-visible 페이지 비율, 마지막 vacuum 이후 삽입된 행, Index Only Scan이 heap을 방문해야 했던 빈도(Heap Fetches)를 보여 준다.

사용 시점

Index Only Scan의 성능이 기대에 못 미칠 때, insert가 많거나 append-only인 테이블, covering(INCLUDE) 인덱스 설계를 검증할 때.

주의

relpages/relallvisible은 마지막 VACUUM/ANALYZE가 기록한 추정치다. visibility map 비트는 VACUUM만 설정하며, 모든 UPDATE/DELETE는 해당 페이지의 비트를 지운다. 자주 갱신되는 테이블의 비율이 낮으면 테이블별로 autovacuum_vacuum_scale_factor를 낮춘다. pg_visibility_map_summary는 heap이 아닌 작은 VM fork를 읽는다.

DBAtlas에서 열기 →

관련 항목