Ana içeriğe geç
Kesit SQL
İleri · Performans

Sorgu optimizasyonu: iyi alışkanlıklar

Hızlı ve ölçeklenebilir SQL yazmanın kuralları.

Uygulamada aç, 7 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Büyük veride fark yaratan alışkanlıklar

  1. SELECT * yazma. Özellikle sütun tabanlı ambarlarda (BigQuery, Snowflake) okunan sütun kadar ödersin.
  2. Erken filtrele. WHERE'i JOIN'den önce veriyi küçültecek şekilde kur; CTE'lerde ihtiyacın olan satırları en başta süz.
  3. Sütuna fonksiyon uygulama (SARGable yaz). WHERE YEAR(d) = 2024 yerine WHERE d >= '2024-01-01' AND d < '2025-01-01'; böylece indeks ve bölüm (partition) budaması çalışır.
  4. Gereksiz DISTINCT ve ORDER BY'dan kaçın. İkisi de sıralama maliyeti getirir.
  5. UNION yerine UNION ALL, tekrar olmayacağını biliyorsan.
  6. EXISTS ile IN: Hangisinin hızlı olduğu motora bağlıdır, çoğu zaman plan aynıdır. Asıl fark NOT IN tarafındadır: alt sorguda NULL varsa hiç satır dönmez, bu yüzden NOT EXISTS tercih edilir.
  7. Önce topla, sonra birleştir. Satır çoğalmasını önler. Hız kazancı motora bağlıdır, ölç.
  8. Planı oku. Tam tarama, iç içe döngü ve tahmini satır sayılarını incele (İndeksler ve sorgu planı dersi).
SQL Server'a özgüParameter sniffing, eksik istatistikler ve örtük tip dönüşümleri (ör. NVARCHAR sütunu VARCHAR parametreyle karşılaştırmak) en sık performans sorunlarıdır. SET STATISTICS IO, TIME ON ile okunan sayfa sayısını ölç.
-- Yavaş kalıp: tarih fonksiyonu sütunu sarıyor
EXPLAIN QUERY PLAN
SELECT COUNT(*) FROM orders WHERE strftime('%Y', order_date) = '2024';
-- Daha iyi: aralık + indeks
CREATE INDEX idx_o_date ON orders(order_date);
EXPLAIN QUERY PLAN
SELECT COUNT(*) FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';

Yavaş sorgu kontrol listesi

Planda gördüğünOlası sebepİlk deneme
Büyük tabloda tam tarama, az satır dönüyorUygun indeks yok ya da koşul sütunu sarıyorKoşulu sade yaz, sonra indeks
Filtre çok satır eliyorBileşik indeks eksik ya da sütun sırası yanlışEşitlik, aralık, sıralama
Tahmin ve gerçek çok farklıBayat istatistik, fonksiyonlu koşul, çarpık veriİstatistiği yenile, koşulu düzelt
Her satır için alt sorguİlişkili alt sorguÖnce topla ve birleştir, ya da iç tarafa indeks
Sıralama ya da geçici yapıSıra indeksten gelmiyorSıralama sütununu indekse ekle
Tabloya geri dönüş (Key Lookup)İndeks sütunları kapsamıyorSütunları daralt, sonra INCLUDE
DISTINCT ve çok satırBirleştirme çoğaltıyorEXISTS ya da önce toplama
Derin OFFSETAtlanan satırlar yine işleniyorKeyset sayfalama

Her satırın ayrı dersi Sorgu Optimizasyonu öğrenme yolunda. Değişiklikten sonra üç soruyu yanıtla: Sonuç aynı mı? Hangi sayı düştü? Karşılığında ne ödedim?

Alıştırmalara geç (7)