DBAtlas · Atlas de operações de banco de dados

Verificar a cobertura do visibility map e a eficiência do Index Only Scan

PostgreSQLManutenção

Comando

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

O que faz

Mostra a proporção de páginas all-visible das tabelas, as linhas inseridas desde o último vacuum e com que frequência um Index Only Scan precisou visitar o heap (Heap Fetches).

Quando usar

Quando um Index Only Scan rende abaixo do esperado; em tabelas com muitas inserções/append-only e ao validar o desenho de um índice de cobertura (INCLUDE).

Atenção

relpages/relallvisible são estimativas registradas pelo último VACUUM/ANALYZE. Só o VACUUM define os bits do visibility map; todo UPDATE/DELETE limpa o bit da página afetada. Para uma proporção baixa em tabelas atualizadas com frequência, reduza autovacuum_vacuum_scale_factor por tabela. pg_visibility_map_summary lê o pequeno fork do VM, não o heap.

Abrir no DBAtlas →

Relacionados