Neden Index?
Bir kurumsal panelin yavaşlaması en sık tek sebepten olur: yanlış veya eksik index. Müşterinizin "her şey yavaşladı" şikayetinin %70'i, doğru index ile dakikalar içinde çözülür.
Index, kitabın arkasındaki konu dizinine benzer. Olmadan da arama yapabilirsiniz ama 800 sayfa karıştırarak. Index varsa, doğrudan sayfaya gidersiniz.
Index Türleri
Clustered Index
Tablonun fiziksel olarak nasıl sıralandığını belirler. Her tabloda en fazla bir tane olabilir. Genellikle birincil anahtar otomatik olarak clustered index alır.
Non-Clustered Index
Ayrı bir yapıda tutulur, "şu kolondaki şu değer, asıl tabloda burada" der. Bir tabloda 5-10 tanesi olabilir.
Composite Index
Birden fazla kolonu birlikte indexler. Sıralama önemli:
CREATE INDEX IX_Siparisler_MusteriDurum
ON Siparisler(MusteriId, Durum);
Bu index WHERE MusteriId = X AND Durum = Y için mükemmel. Ama WHERE Durum = Y sorgusu için işe yaramaz (ilk kolon eksik).
Doğru Index Seçimi
Index eklemeden önce şu üç soruyu sorun:
- Bu kolon
WHERE,JOINveyaORDER BY'da kullanılıyor mu? - Cardinality (eşsiz değer sayısı) yeterince yüksek mi? (Cinsiyet kolonunu indexlemek anlamsız)
- Tabloya yazma/güncelleme sıklığı, okuma sıklığından makul oranda mı düşük?
Her yeni index yazma işlemini yavaşlatır. 10 index'i olan bir tabloya INSERT, 1 index'lisinden 3-5 kat yavaştır. Index "bedava" değildir.
Gerçek vaka: 6 saat → 200 ms
Bir stok yönetim panelinde rapor sorgusu 6 saatte tamamlanıyordu (cron'da gece çalışıyor, çoğu zaman tamamlanmadan kalkıyordu). Sorgu özünde basitti:
SELECT TOP 100 *
FROM StokHareketleri h
WHERE h.UrunId IN (...)
AND h.TarihUtc >= @bas
ORDER BY h.TarihUtc DESC;
Tabloda UrunId tek başına indexli, TarihUtc indexsizdi. Composite index ile:
CREATE NONCLUSTERED INDEX IX_StokHareketleri_UrunTarih
ON StokHareketleri(UrunId, TarihUtc DESC);
Sorgu süresi: 200 ms. Yapılan tek değişiklik bu.
Sık Yapılan Hatalar
- Çok fazla index — INSERT/UPDATE yavaşlar
- WHERE'de fonksiyon —
WHERE YEAR(Tarih) = 2024index'i devre dışı bırakır - SELECT * — covering index avantajını yok eder
- Index istatistiklerini güncellememek —
UPDATE STATISTICSkomutu unutulmamalı
sys.dm_exec_query_stats view'ı ile görebilirsiniz. Çıktıyı süreye göre sıralayıp ilk 10 sorguyu optimize etmek, en yüksek ROI'li iştir.