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=10 vs actual 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 da work_mem artı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 time alan düğüm darboğazdır.

Index'in kullanılmamasının yaygın nedenleri

  1. Sütuna fonksiyon uygulanması: WHERE LOWER(email) = ... (çözüm: expression index)
  2. Tip uyuşmazlığı: sayı sütununu string ile karşılaştırmak
  3. LIKE '%abc' gibi başta joker karakter
  4. Düşük seçicilik: tablonun büyük kısmı dönüyorsa optimizer bilerek Seq Scan seçer
  5. 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.

  1. INNER JOIN ile LEFT JOIN arasındaki fark nedir?KolayVeritabanı & SQLBackend
  2. Bir tablodaki ikinci en yüksek maaşı bulun.OrtaVeritabanı & SQLBackend
  3. Index nedir? Dezavantajları nelerdir?OrtaVeritabanı & SQLBackend
  4. ACID nedir?OrtaVeritabanı & SQLBackend
  5. Normalizasyon nedir? Ne zaman denormalizasyon yaparsınız?ZorVeritabanı & SQLBackend
  6. N+1 sorgu problemi nedir ve nasıl çözülür?OrtaVeritabanı & SQLBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle