Vérifier la couverture de la visibility map et l'efficacité des Index Only Scan
PostgreSQLMaintenanceCommande
-- 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');Ce que fait la commande
Affiche le taux de pages all-visible des tables, les lignes insérées depuis le dernier vacuum, et la fréquence à laquelle un Index Only Scan a dû accéder au heap (Heap Fetches).
Quand l'utiliser
Lorsqu'un Index Only Scan est sous-performant ; sur les tables à forte insertion/append-only et lors de la validation de la conception d'un index couvrant (INCLUDE).
Attention
relpages/relallvisible sont des estimations enregistrées par le dernier VACUUM/ANALYZE. Seul VACUUM positionne les bits de la visibility map ; chaque UPDATE/DELETE efface le bit de la page concernée. Pour un taux faible sur des tables fréquemment mises à jour, abaissez autovacuum_vacuum_scale_factor par table. pg_visibility_map_summary lit le petit fork VM, pas le heap.