Index Oluşturma Hatası: Yavaş Sorgular ve Disk Alanı

# Index Oluşturma Hatası: Yavaş Sorgular ve Boşa Harcanan Disk Alanı

Çoğu zaman index oluşturma işi basit görünür: bir sütuna index ekle, sorgu hızlanır. Ama gerçek daha karmaşık. Yanlış strateji uygulandığında sorguların daha da yavaşladığını, diskin boşa harcandığını ve yazma işlemlerinin ağırlaştığını görebilirsin.

Index, veritabanında veri bulma işini hızlandırır. Ama her index ek disk alanı tutar ve INSERT, UPDATE, DELETE işlemlerinde bakım maliyeti oluşturur. Hatalı index stratejisi şu sonuçları doğurur:

- Kullanılmayan indexler: Sorguya katkısı olmayan, sadece disk tüketen indexler.
- Çok fazla index: Her yazma işleminde tüm indexler güncellenir; yazma yavaşlar.
- Yanlış sütun seçimi: Seçici olmayan (low cardinality) sütunlara index ekleme.
- Sorgu planı göz ardı etme: Index var olsa bile sorgu motoru kullanmayabilir.

Aşağıdaki tabloyu düşün:

1CREATE TABLE siparisler (
2id INT PRIMARY KEY,
3musteri_id INT,
4durum VARCHAR(20),
5tarih DATE,
6tutar DECIMAL(10,2)
7);

Eğer şu sorguyu sık çalıştırıyorsan:

1SELECT * FROM siparisler WHERE musteri_id = 5 AND durum = 'tamamlandi';

Yanlış yaklaşım, her sütuna ayrı index eklemek:

1CREATE INDEX idx_musteri ON siparisler(musteri_id);
2CREATE INDEX idx_durum ON siparisler(durum);

Doğru yaklaşım, iki sütundan oluşan bileşik index:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1CREATE INDEX idx_musteri_durum ON siparisler(musteri_id, durum);

Sorgu planını kontrol et:

1EXPLAIN SELECT * FROM siparisler WHERE musteri_id = 5 AND durum = 'tamamlandi';

Çıktı:
- Yanlış indexlerle: "Using where; Using index condition" (iki indexi de tarar, yavaş)
- Doğru indexle: "Using index" (doğrudan index kullanır, hızlı)

1. Kullanılmayan indexleri bul ve sil:

1SELECT OBJECT_NAME(i.object_id) AS tablo,
2i.name AS index_adi,
3s.user_updates,
4s.user_seeks
5FROM sys.indexes i
6JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id
7WHERE s.user_seeks = 0 AND s.user_scans = 0;

2. Index boyutunu kontrol et:

1SELECT i.name, (ps.used_page_count * 8) / 1024 AS boyut_MB
2FROM sys.indexes i
3JOIN sys.dm_db_partition_stats ps ON i.object_id = ps.object_id
4WHERE ps.used_page_count > 1000;

3. Sütun seçiciliğini (selectivity) kontrol et:

1SELECT COUNT(DISTINCT durum) AS benzersiz_deger,
2COUNT(*) AS toplam_satir,
3(COUNT(DISTINCT durum) * 100.0 / COUNT(*)) AS seçicilik_yuzde
4FROM siparisler;

Seçicilik %10'dan düşükse index faydasız.

4. Sorgu planını analiz et ve index sırasını WHERE koşuluna göre ayarla.

Doğru index stratejisi: sorguyu hızlandırır, diski korur, yazma işlemlerini ağırlaştırmaz.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz