Soru geçmişi:
SQL sorguları başlangıcından itibaren, "ne almak" üzerine tasarlanmış, "nasıl almak" üzerine değil. Veritabanı yönetim sistemi (VYS) optimizatörü, bağlantıların, filtrelemelerin, taramaların ve indekslerin kullanım sırasını belirleyen bir yürütme planı hazırlar.
Problemi:
Yürütme planı hakkında bilgi sahibi olmadan, basit görünen bir sorgunun neden çok yavaş çalıştığını veya karmaşık bir sorgunun neden hızlı çalıştığını açıklamak mümkün değildir. Yanlış bir plan, gereksiz işlemler veya yanlış indeks kullanımı nedeniyle sunucuyu saatlerce kilitleyebilir.
Çözüm:
Analiz araçları; EXPLAIN, EXPLAIN ANALYZE (PostgreSQL), SHOW EXPLAIN (MySQL), Yönetim Stüdyosu Yürütme Planı (SQL Server) gibi talimatları içerir. Bu araçlarla, sorgunun nasıl adım adım yürütüldüğünü, hangi veri miktarının okunduğunu, hangi indeksin kullanıldığını, tüm tablonun tarandığı yerleri ve gecikmelerin nerede meydana geldiğini görebiliriz.
Kod örneği:
EXPLAIN ANALYZE SELECT * FROM orders o JOIN customers c ON o.customer_id = c.id WHERE o.status = 'shipped';
Anahtar özellikler:
İndeks eklemek, sorguyu her zaman hızlandırır mı?
Hayır! İndeks yalnızca filtrelemenin belirli bir alanda döndürülen satır sayısını önemli ölçüde sınırladığı durumlarda yardımcı olur. Eğer çoğu kayıt koşula uyuyorsa, optimizatör indeksi göz ardı edebilir.
Örnek:
-- 'gender' alanı yalnızca iki değer alıyor — indeks yardım etmeyecek CREATE INDEX idx_gender ON people(gender); SELECT * FROM people WHERE gender = 'M';
JOIN'deki tablo sırası yürütme sonucuna bağlı mı?
Hayır, nihai veriler aynı olacak, ancak optimizatör, performansı artırmak için bağlantıların yürütme sırasını değiştirebilir. Ancak belirli bir JOIN yazılmışsa veya "JOIN HINT" gibi ipuçları kullanılıyorsa, sıralama yürütme etkinliğini etkileyebilir.
Yürütme planındaki "Estimated rows" ve "Actual rows"'ı analiz etmenin önemi nedir?
Aralarındaki fark, tablo istatistiklerinin güncel olmadığını veya gerçeklerle uyuşmadığını gösterebilir, yani plan optimal değildir — istatistikleri güncellemeniz veya sorgu yapısını yeniden gözden geçirmeniz gerekebilir.
-- PostgreSQL ANALYZE table_name; -- istatistikleri güncelle
Bir projede analistler "raporların donmasından" uzun süredir şikayet ettiler. Beş JOIN içeren bir sorgu 25 dakika sürdü. Görüldü ki, büyük bir tablonun tam tarama planı seçilmişti, indeksler yanlış alanlardaydı ve istatistik bir yıl boyunca güncellenmemişti.
Artılar:
Eksiler:
Yürütme planını analiz ettik, gerçekten filtreleme yapan bir alana indeks ekledik, istatistikleri güncelledik. Sorgu süresi 20 saniyeye düştü. Sunucu yükünü önemli ölçüde azalttık.
Artılar:
Eksiler: