Yeni proje teklifleri kabul ediliyor +90 505 113 90 33 / muhammetelma24@gmail.com
Ana Sayfa/ Blog/Rehber
Rehber 22 Ocak 2025 9 dk okuma

MSSQL Index Stratejileri

Hangi sorguya hangi index? Yavaşlayan kurumsal panellerde 6 saatlik query'yi 200 ms'ye indiren çözüm.

[ Kapak görseli — MSSQL Index Stratejileri ]

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:

  1. Bu kolon WHERE, JOIN veya ORDER BY'da kullanılıyor mu?
  2. Cardinality (eşsiz değer sayısı) yeterince yüksek mi? (Cinsiyet kolonunu indexlemek anlamsız)
  3. 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 fonksiyonWHERE YEAR(Tarih) = 2024 index'i devre dışı bırakır
  • SELECT * — covering index avantajını yok eder
  • Index istatistiklerini güncellememekUPDATE STATISTICS komutu unutulmamalı
SQL Server'da kontrol Hangi sorguların yavaş çalıştığını 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.
← Önceki Yazı

Entity Framework Core'da Performans Tuzakları

ASP.NET Core · 02 Şubat 2025
Sonraki Yazı →

Razor Layout & Partial View'ları Doğru Kullanmak

Web Geliştirme · 10 Ocak 2025
İlgili Yazılar

Bunlar da ilgini çekebilir.

Yazıyı beğendin mi?

Benzer içeriklerden haberdar olmak veya bir proje konuşmak için ulaş.