DBAtlas · Atlas für Datenbankbetrieb

Abdeckung der Visibility Map und Effizienz von Index Only Scans prüfen

PostgreSQLWartung

Befehl

-- 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');

Was es tut

Zeigt den Anteil all-visible markierter Seiten der Tabellen, seit dem letzten Vacuum eingefügte Zeilen und wie oft ein Index Only Scan auf den Heap zugreifen musste (Heap Fetches).

Wann einsetzen

Wenn ein Index Only Scan zu schwach abschneidet; bei insert-lastigen/Append-only-Tabellen und beim Validieren eines Covering-Index-Designs (INCLUDE).

Vorsicht

relpages/relallvisible sind Schätzungen, die das letzte VACUUM/ANALYZE festgehalten hat. Nur VACUUM setzt Bits der Visibility Map; jedes UPDATE/DELETE löscht das Bit der betroffenen Seite. Bei niedrigem Anteil auf häufig geänderten Tabellen autovacuum_vacuum_scale_factor je Tabelle senken. pg_visibility_map_summary liest den kleinen VM-Fork, nicht den Heap.

In DBAtlas öffnen →

Verwandte Einträge