# Veritabanı Index Yönetimi: Görünmez Değişiklik Riski

Index eklemek veya kaldırmak zararsız bir operasyon gibi görünür. Ama yanlış zamanda ya da yanlış şekilde yapıldığında production'ı ciddi biçimde etkileyebilir.

Index Değişikliği Neden Risk Taşır? Index, sorgu performansını doğrudan etkiler. Bir index eklendiğinde bazı sorgular hızlanır, bazıları yavaşlayabilir. Bir index kaldırıldığında tam tersi olur. Bu dengeyi öngörmek çoğu zaman zordur. Bunun dışında index operasyonlarının kendisi de risk taşır: Tablo kilitleme: Büyük bir tabloda index oluşturmak ya da yeniden oluşturmak tabloyu kilitleyebilir. Bu süreçte tabloya erişmeye çalışan sorgular bekler ya da timeout alır. Disk ve CPU yükü: Index operasyonları yoğun I/O ve CPU kullanır. Yanlış zamanda yapılırsa sistem genelini etkiler.

En Sık Yapılan Hatalar Yanlış saatte index rebuild Geliştirici performans sorununu fark etti, index rebuild başlattı. Saat 14:00, sistem yoğun. Tablo kilitlendi, onlarca sorgu beklemeye geçti. Müşteri şikayetleri başladı. Test edilmeden production'a index ekleme "Bu index sorguyu hızlandırır" diye test ortamında denenmeden production'a eklendi. Evet, hedef sorgu hızlandı. Ama aynı tabloyu kullanan başka bir sorgu sorgu planını değiştirdi ve yavaşladı. Kullanılmayan index birikimi Zaman içinde ihtiyaç kalmayan indexler kaldırılmadı. Her index INSERT ve UPDATE işlemlerini yavaşlatır. Tabloda onlarca gereksiz index olduğunda yazma performansı ciddi biçimde düşer.

Index Değişikliği Öncesi Kontroller Yeni index eklemeden önce şunları kontrol edin: Bu index zaten var mı? Benzer bir index mevcut değil mi? sqlSELECT i.name AS IndexAdi, i.type\_desc AS IndexTipi, STRING\_AGG(c.name, ', ') AS Kolonlar FROM sys.indexes i JOIN sys.index\_columns ic ON i.object\_id = ic.object\_id AND i.index\_id = ic.index\_id JOIN sys.columns c ON ic.object\_id = c.object\_id AND ic.column\_id = c.column\_id WHERE i.object\_id = OBJECT\_ID('dbo.HedefTablo') GROUP BY i.name, i.type\_desc ORDER BY i.name; Bu index ne kadar kullanılacak? İlgili sorgu gerçekten yeterli sıklıkta çalışıyor mu? Online operasyon mümkün mü? Enterprise Edition'da ONLINE = ON seçeneği tabloyu kilitlemeden index oluşturur.

Kullanılmayan Index Tespiti sqlSELECT OBJECT\_NAME(i.object\_id) AS Tablo, i.name AS IndexAdi, ius.user\_seeks, ius.user\_scans, ius.user\_lookups, ius.user\_updates FROM sys.indexes i LEFT JOIN sys.dm\_db\_index\_usage\_stats ius ON i.object\_id = ius.object\_id AND i.index\_id = ius.index\_id AND ius.database\_id = DB\_ID() WHERE i.type\_desc != 'HEAP' AND i.is\_primary\_key = 0 AND i.is\_unique = 0 ORDER BY ISNULL(ius.user\_seeks, 0) + ISNULL(ius.user\_scans, 0) ASC; Bu sorgu az kullanılan index'leri listeler. Kaldırma kararı vermeden önce SQL Server'ın son restart'ından bu yana ne kadar süre geçtiğini kontrol edin, çünkü istatistikler restart'ta sıfırlanır.

Sonuç Index değişiklikleri şema değişiklikleri kadar dikkatli yönetilmeli. Test ortamında doğrulama, doğru zamanlama ve etki analizi index operasyonlarını güvenli hale getirir. Detaylı bilgi için: sqlchangeguard.com
