EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL) ile planı derinlemesine oku
PostgreSQLPerformansKomut
-- ANALYZE sorguyu gerçekten çalıştırır: DML'i transaction içinde çalıştırıp geri al
BEGIN;
EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL, VERBOSE)
UPDATE musteri SET bakiye = bakiye + 1 WHERE il = 'Ankara';
ROLLBACK;
-- SELECT için
EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
SELECT ad FROM musteri ORDER BY ad DESC LIMIT 10 OFFSET 1000;Ne yapar?
Planı gerçek çalıştırma istatistikleriyle verir: BUFFERS her düğümdeki shared hit/read/dirtied ve temp bloklarını, SETTINGS planı etkileyen varsayılan dışı parametreleri, WAL üretilen WAL kayıt/bayt miktarını gösterir.
Ne zaman kullanılır?
Tahmini ve gerçek satır sayısı farkını, diske taşan sort/hash'i (Sort Method: external merge, temp read/written) ve DML'in WAL maliyetini analiz etmek için.
Dikkat
ANALYZE sorguyu gerçekten çalıştırır; DML'i mutlaka BEGIN/ROLLBACK içinde çalıştır (trigger'lar ve sequence artışları yine de gerçekleşir). Okuma ipuçları: 'rows' tahmini ile 'actual rows' arasında 10 kat ve üzeri fark istatistik sorununa işaret eder; döngüdeki düğümlerde süre ve satırlar loops başınadır, toplam için loops ile çarp; Index Only Scan'de yüksek 'Heap Fetches' visibility map'in güncel olmadığını, 'Workers Planned' > 'Workers Launched' worker havuzunun tükendiğini gösterir. Timing yükü yüksek sistemlerde TIMING OFF kullan; COSTS OFF, JIT bölümünü de gizler.
İlgili
- En pahalı sorguları bul (pg_stat_statements: toplam ve ortalama süre)
- Disk I/O, temp dosya ve WAL üreten sorguları bul (pg_stat_statements)
- pg_stat_statements istatistiklerini sıfırla (tümü veya tek sorgu)
- auto_explain ile yavaş sorguların execution plan'ını logla
- Plan regresyonunu queryid ile yakala (pg_stat_statements snapshot karşılaştırması)
- Paralel sorgu kapasitesini ve anlık worker kullanımını denetle