Büyük veride fark yaratan alışkanlıklar
- SELECT * yazma. Özellikle sütun tabanlı ambarlarda (BigQuery, Snowflake) okunan sütun kadar ödersin.
- Erken filtrele. WHERE'i JOIN'den önce veriyi küçültecek şekilde kur; CTE'lerde ihtiyacın olan satırları en başta süz.
- Sütuna fonksiyon uygulama (SARGable yaz).
WHERE YEAR(d) = 2024yerineWHERE d >= '2024-01-01' AND d < '2025-01-01'; böylece indeks ve bölüm (partition) budaması çalışır. - Gereksiz DISTINCT ve ORDER BY'dan kaçın. İkisi de sıralama maliyeti getirir.
- UNION yerine UNION ALL, tekrar olmayacağını biliyorsan.
- EXISTS ile IN: Hangisinin hızlı olduğu motora bağlıdır, çoğu zaman plan aynıdır. Asıl fark
NOT INtarafındadır: alt sorguda NULL varsa hiç satır dönmez, bu yüzdenNOT EXISTStercih edilir. - Önce topla, sonra birleştir. Satır çoğalmasını önler. Hız kazancı motora bağlıdır, ölç.
- 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üğün | Olası sebep | İlk deneme |
|---|---|---|
| Büyük tabloda tam tarama, az satır dönüyor | Uygun indeks yok ya da koşul sütunu sarıyor | Koşulu sade yaz, sonra indeks |
| Filtre çok satır eliyor | Bileş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 gelmiyor | Sıralama sütununu indekse ekle |
| Tabloya geri dönüş (Key Lookup) | İndeks sütunları kapsamıyor | Sütunları daralt, sonra INCLUDE |
| DISTINCT ve çok satır | Birleştirme çoğaltıyor | EXISTS ya da önce toplama |
| Derin OFFSET | Atlanan satırlar yine işleniyor | Keyset 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?