DBAtlas · データベース運用アトラス

可視性マップのカバー率と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 Fetches)を表示する。

使用する場面

Index Only Scanの性能が低いとき。挿入中心/追記のみの表、カバリング(INCLUDE)インデックス設計の検証時に。

注意

relpages/relallvisibleは最後のVACUUM/ANALYZEで記録された推定値。可視性マップのビットを設定するのはVACUUMのみで、UPDATE/DELETEのたびに該当ページのビットがクリアされる。頻繁に更新される表で割合が低い場合は、表ごとにautovacuum_vacuum_scale_factorを下げる。pg_visibility_map_summaryはヒープではなく小さなVMフォークを読み取る。

DBAtlas で開く →

関連項目