DBAtlas · Veritabanı operasyon atlası

Tablo ve index bloat'ını pgstattuple ile ölç

PostgreSQLBakım

Komut

CREATE EXTENSION IF NOT EXISTS pgstattuple;

-- Hızlı tahmin: visibility map'te all-visible sayfaları okumaz
SELECT pg_size_pretty(table_len) AS table_size,
       round(approx_tuple_percent::numeric, 1) AS live_pct,
       round(dead_tuple_percent::numeric, 1) AS dead_pct,
       round(approx_free_percent::numeric, 1) AS free_pct
FROM pgstattuple_approx('siparis');

-- Kesin ölçüm: tüm tabloyu okur
SELECT pg_size_pretty(table_len) AS table_size,
       round(dead_tuple_percent::numeric, 1) AS dead_pct,
       round(free_percent::numeric, 1) AS free_pct,
       pg_size_pretty(dead_tuple_len + free_space) AS reclaimable
FROM pgstattuple('siparis');

-- B-tree index'ler: yaprak doluluğu (yeni oluşturulmuş ~90; 50'nin altı bloat'lı)
WITH idx AS MATERIALIZED (
  SELECT i.indexrelid
  FROM pg_index i
  JOIN pg_class c ON c.oid = i.indexrelid
  JOIN pg_am am ON am.oid = c.relam
  WHERE am.amname = 'btree' AND i.indrelid = 'siparis'::regclass
)
SELECT idx.indexrelid::regclass AS index_name,
       pg_size_pretty(s.index_size) AS index_size,
       s.avg_leaf_density,
       s.leaf_fragmentation
FROM idx
CROSS JOIN LATERAL pgstatindex(idx.indexrelid) s;

Ne yapar?

Tablodaki canlı/ölü satır ve boş alan yüzdesini (hızlı tahmini ve kesin olarak) ve geri kazanılabilir alanı; B-tree index'lerin yaprak doluluk ve fragmentasyon oranını gösterir.

Ne zaman kullanılır?

pg_stat_user_tables'taki n_dead_tup tahmini yeterli olmadığında; pg_repack, VACUUM FULL veya REINDEX kararını veriyle desteklemek için.

Dikkat

pgstattuple ve pgstatindex tüm ilişkiyi okur; büyük tablolarda yoğun I/O üretir (yalnızca AccessShareLock alır). Önce pgstattuple_approx kullan. Varsayılan olarak superuser veya pg_stat_scan_tables rolü gerekir. Bir miktar boş alan normaldir (fillfactor, HOT update payı); VACUUM bu alanı yeniden kullanılabilir yapar ama dosyayı küçültmez, geri kazanmak için pg_repack ya da VACUUM FULL (ACCESS EXCLUSIVE lock!) gerekir. avg_leaf_density düşük index'i REINDEX CONCURRENTLY ile yenile.

DBAtlas'ta aç →

İlgili