Yavaş bir sorguyu EXPLAIN ile nasıl analiz edersiniz?
Cevap
EXPLAIN, veritabanının sorguyu nasıl çalıştırmayı planladığını gösterir. EXPLAIN ANALYZE (PostgreSQL) sorguyu gerçekten çalıştırır ve gerçek süreleri ile satır sayılarını da verir.
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM siparisler WHERE musteri_id = 42 ORDER BY tarih DESC LIMIT 20;Dikkat: EXPLAIN ANALYZE bir UPDATE/DELETE üzerinde çalıştırılırsa değişikliği gerçekten yapar; transaction içinde çalıştırıp ROLLBACK edin.
Nelere bakılır?
- Seq Scan büyük bir tabloda: muhtemelen eksik ya da kullanılmayan index.
- Index Scan / Index Only Scan / Bitmap Index Scan: index kullanılıyor.
- Tahmini vs gerçek satır sayısı (
rows=10vsactual rows=50000): büyük fark eski istatistik demektir,ANALYZE tablo;çalıştırın. - Sort ve
external merge Disk: sıralama belleğe sığmıyor; index ile sıralamayı önleyin ya dawork_memartırın. - Join tipi: Nested Loop (küçük setler), Hash Join (büyük eşitlik join'leri), Merge Join (sıralı girdiler).
- En yüksek
actual timealan düğüm darboğazdır.
Index'in kullanılmamasının yaygın nedenleri
- Sütuna fonksiyon uygulanması:
WHERE LOWER(email) = ...(çözüm: expression index) - Tip uyuşmazlığı: sayı sütununu string ile karşılaştırmak
LIKE '%abc'gibi başta joker karakter- Düşük seçicilik: tablonun büyük kısmı dönüyorsa optimizer bilerek Seq Scan seçer
- Composite index'te leftmost prefix kuralına uymamak
Genel süreç
Yavaş sorguları pg_stat_statements veya slow query log ile bulun, EXPLAIN ANALYZE ile darboğazı tespit edin, index veya sorgu yeniden yazımı uygulayın ve tekrar ölçün.
İlgili Veritabanı & SQL soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.