Kullanılmayan Index’leri Tespit Etmek
Index, genel olarak veritabanındaki performası artıran bir nesnedir. Fakat performansı arttırır düşüncesi ile tecrübesiz bir çok veritabanı yöneticisi ya da uygulamacı veritabanı çok sayıda index ekler. Bu index’lerden büyük bir kısmına ya çok az ihtiyaç olur ya da hiç ihtiyaç olmaz.
İyi bir veritabanı yöneticisi bir veritabanı sistemine bakmaya başladığında ilk yapması gereken işlemlerden biri veritabanlarındaki kullanılmayan indexleri tespit edip kaldırmaktır. Kullanılmayan tabloları bulmak için de “Kullanılmayan Tabloları Tespit Etmek” isimli makaleye göz atmak isteyebilirsiniz.
Aşağıdaki script yardımıyla sql server servisinin en son restartından bu yana kullanılmamış index’leri bulabilirsiniz.
select SCHEMA_NAME(tbl.schema_id) as [Şema İsmi], OBJECT_NAME(us.object_id) as [Tablo İsmi], 'DROP INDEX '+i.name + ' ON [' + SCHEMA_NAME(tbl.schema_id)+'].['+ OBJECT_NAME(us.object_id)+ ']' as [Drop Index Script], us.last_user_seek [Son Seek Zamanı], us.user_seeks [Seek Sayısı], CASE us.user_seeks WHEN 0 THEN 0 ELSE us.user_seeks*1.0 /(us.user_scans + us.user_seeks) * 100.0 END AS SeekYüzdesi, us.last_user_scan [Son Scan Zamanı], us.user_scans [Scan Sayısı], CASE us.user_scans WHEN 0 THEN 0 ELSE us.user_scans*1.0 /(us.user_scans + us.user_seeks) * 100.0 END AS ScanYüzdesi, us.last_user_update [Son Update Zamanı], us.user_updates [Update Sayısı] FROM sys.dm_db_index_usage_stats us INNER JOIN sys.indexes i ON i.object_id=us.object_id and i.index_id = us.index_id INNER JOIN sys.tables tbl ON tbl.object_id=us.object_id WHERE us.database_id = DB_ID('VeritabaniAdi') AND us.user_seeks=0 AND us.user_scans=0