İndex'lerin Kullanım İstatistikleri

İndex'lerin Kullanım İstatistikleri

Non-Clustered İndex'leri tune ederken başvurabileceğiniz bir yöntem.

DBA'ler arasındaki yaygın bir görüşe göre index'ler veritabanımızın beygir gücüdür. Ancak gereksiz, yanlış oluşturulmuş dolayısıyla neredeyse hiç kullanılmayan index'ler -özellikle çok fazla insert vb. işlem yapılan tablo üzerindeyse- bize yarardan çok zarar getirir. Dolayısıyla bu index'leri tespit etmek ve gerekli değişiklikleri yapmak bir DBA'in öncelikli görevlerindendir.

Aşağıda yazmış olduğum kod ile kullanılmayan index'lerin detaylarını kendinize mail olarak gönderebilirsiniz.

USE DB_Adı
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
        
        --Query sonucunu mail atması için html formatta tablo oluşturma
        DECLARE @tableHTML  NVARCHAR(MAX) ;
        SET @tableHTML =
        N'<H3><font color="blue">Kullanılmayan Indexler</font></H3>' +
        N'<table border="1">' +
        N'<tr><th><font color="red">TableName</font>' +
        N'<th><font color="red">IndexName</font>' +
        N'<th><font color="red">Seek</font>' +
        N'<th><font color="red">Scan</font>' +
        N'<th><font color="red">LookUp</font>' +
        N'<th><font color="red">Update</font> '+
        N'<th><font color="red">Size(MB)</font></th>'+
        CAST ( ( SELECT                           
                         td = OBJECT_NAME(usage.object_id) , '',
                         td = i.name , '',
                         td = usage.user_seeks , '',
                         td = usage.user_scans , '',
                         td = usage.user_lookups , '',
                         td = usage.user_updates , '',
                         td = 8 * SUM(a.used_pages) /1024, ''
                      FROM sys.indexes AS i
JOIN sys.partitions AS p ON p.object_id = i.object_id AND p.index_id = i.index_id
JOIN sys.allocation_units AS a ON a.container_id = p.partition_id
JOIN sys.dm_db_index_usage_stats AS usage ON i.object_id = usage.object_id 
AND i.index_id = usage.index_id
where i.name NOT LIKE 'PK_%' --Clustered indexleri elemine ediyoruz
and
(usage.user_seeks +
usage.user_scans +
usage.user_lookups) < 5000 -- Toplam kullanım sayısı
GROUP BY usage.object_id,usage.user_seeks,i.name,usage.user_scans,
usage.user_lookups,
usage.user_updates
having 8 * SUM(a.used_pages) /1024 > 900 -- 900 MBtan düşük indexleri elemine ediyoruz
order by 1 desc
          FOR XML PATH('tr'), TYPE 
        ) AS NVARCHAR(MAX) ) +
        N'</table>';
        

    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'profil_adı',
        @recipients = 'mail1; mail2',
        @subject = 'Kullanılmayan Indexler',
        @body = @tableHTML,
        @body_format = 'HTML';


Tabii siz kodun üzerinde değişiklik yaparak data'yı bir tabloya atabilirsiniz ya da bunu job'a dönüştürüp günlük kullanımlarını takip edebilirsiniz.

İyi Çalışmalar

Enes Kütük
1991 yılında İstanbul'da doğdum. 2014 Namık Kemal Üniversitesi Bilgisayar Mühendisliği bölümünden mezun oldum. Kariyerime veritabanı yöneticisi olarak devam ediyorum.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git