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:
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_seeks5FROM sys.indexes i6JOIN sys.dm_db_index_usage_stats s ON i.object_id = s.object_id7WHERE 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_MB2FROM sys.indexes i3JOIN sys.dm_db_partition_stats ps ON i.object_id = ps.object_id4WHERE 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_yuzde4FROM 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.
0 yorum