Visibility map durumunu ve Index Only Scan verimini kontrol et
PostgreSQLBakımKomut
-- all-visible sayfa oranı düşük tablolar: Index Only Scan heap'e gitmek zorunda kalır
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;
-- Planda "Heap Fetches" döndürülen satıra yakınsa visibility map güncel değildir
EXPLAIN (ANALYZE, BUFFERS) SELECT id FROM musteri WHERE id BETWEEN 1 AND 50000;
-- Kesin sayım (pg_visibility eklentisi)
CREATE EXTENSION IF NOT EXISTS pg_visibility;
SELECT * FROM pg_visibility_map_summary('musteri');Ne yapar?
Tabloların all-visible sayfa oranını, son vacuum'dan bu yana eklenen satırları ve Index Only Scan'in heap'e kaç kez gitmek zorunda kaldığını (Heap Fetches) gösterir.
Ne zaman kullanılır?
Index Only Scan beklenen performansı vermiyorsa; insert ağırlıklı/append-only tablolarda ve covering (INCLUDE) index tasarımını doğrularken.
Dikkat
relpages/relallvisible son VACUUM/ANALYZE'ın kaydettiği tahminlerdir. Visibility map bitlerini yalnızca VACUUM set eder; her UPDATE/DELETE ilgili sayfanın bitini temizler. Sık güncellenen tablolarda düşük oran için autovacuum_vacuum_scale_factor'ü tablo bazında düşür. pg_visibility_map_summary küçük olan VM dosyasını okur, heap'i taramaz.