Eksik Index’leri Tespit Etmek
Veritabanında özellikle yeni geliştirme aşamasında index’ler bizim için en önemli performans sağlayıcılarındandır. Eksik index’leri tespit etmeden önce index kavramını yakından tanımanız gerekir. “SQL Server’da Index Kavramı ve Performansa Etkisi” isimli makale size yardımcı olacaktır.
Aşağıdaki sorgu veritabanınızdaki eksik index’leri tespit etmek adına sizin için bir başlangıç olacaktır. Ama sorguda dönen tüm index oluşturma script’lerini çalıştırmanız doğru bir çözüm olmayacaktır. Sorgu Geliştirme Ölçüsü en fazla olan index oluşturma script’i en yukarda olacak şekilde sıralandı. Yani ilk kayıttan incelemeye başlamalısınız. Benim ortamımda ilk sorguya baktığımda 20 kolonlu bir tabloda 17 kolonu include olarak yerleştirmiş. Tabiki bu index’i oluşturmadım. Çünkü bu tabloyu yeniden oluşturmakla hemen hemen aynı anlama geliyor. Yukarda belirttiğim makalede hangi index’i oluşturup hangi index’i oluşturmayacağımızla ilgili detaylı bilgiler verdim.
SELECT mid.statement AS Sorgu ,migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS [Geliştirme Ölçüsü], 'CREATE INDEX [IX_'+LEFT (PARSENAME(mid.statement, 1), 32)+'_' +ISNULL(REPLACE(REPLACE(REPLACE(REPLACE(mid.equality_columns, '[',''),',','_'),']',''),' ',''),'')+ +ISNULL('_'+REPLACE(REPLACE(REPLACE(REPLACE(mid.inequality_columns, '[',''),',','_'),']',''),' ',''),'')+']' + ' ON ' + mid.statement + ' (' + ISNULL (mid.equality_columns,'') + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL (mid.inequality_columns, '') + ')' + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS [Index Create Script'i] FROM sys.dm_db_missing_index_groups mig INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10 and mid.database_id=DB_ID() ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC
Kullanılmayan index ve tabloları bulmak için de aşağıdaki makalelerden faydalanabilirsiniz.
“Kullanılmayan Index’leri Tespit Etmek“,
“Kullanılmayan Tabloları Tespit Etmek“