Veritabanının İhtiyacı Olan Indexleri Tespit Etme
Index, veri tabanı tabloları üzerinde tanımlanan ve veriye daha az işlemle daha hızlı ulaşan veri tabanı nesneleridir. Indexler hakkında klasik bir örnek olarak telefon rehberi verilebilir. Telefon rehberindeki kayıtların sıralı olmaması durumunda, yani her kaydın telefon defterinde rastgele tutulması durumunda, arayacağımız bir isim için tüm rehberi gezmemiz gerekecek. Ama rehberinizdeki kayıtlar sıralı olsaydı, aradığımız ismin rehberin ortasındaki isimden ileride mi yoksa geride mi olduğuna bakabilirdik. Bu şekilde aradığımız verileri eleyerek bir kaç adımda istediğimiz sonuca ulaşabilirdik. Bu örnekteki gibi verinin sıralı tutulmasını sağlayan nesnelere index denir.
Bu tarz hangi indexlere ihtiyacımız olduğunu bulabilmemiz için SQL’in bize sunduğu bir hizmet mevcut. Bundan yararlanarak hangi indexleri oluşturmamız gerektiğini bulacağız. Aşağıdaki sorguyu hangi veritabanında çalıştırmamız gerekiyorsa orada çalıştırıyoruz. Ve Create_Statement alanında gelen cevapları alarak new query de çalıştırıyoruz. Böylece ihtiyacımız olan indexleri Sql tarafından tespit edilenleri oluşturmuş oluyoruz. Sql hangi indexe ihtiyacımız şu şekilde tespit ediyor. Bir select işlemi yaptığımızda ve bunu bir kaç kere tekrarladığımızda Sql kendi içinde şunu demeye başlıyor, bu işlem için index oluşturursan senin için daha hızlı cevap dönebilirim. Sql’in bu şekilde bize önerdiği indexleri aşağıdaki sorgudan yukarıda tarif ettiğim şekilde bulabiliyoruz.
SELECT
dm_mid.database_id AS DatabaseID,
dm_migs.avg_user_impact*(dm_migs.user_seeks+dm_migs.user_scans) Avg_Estimated_Impact,
dm_migs.last_user_seek AS Last_User_Seek,
OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) AS [TableName],
'CREATE INDEX [PDIX_' + OBJECT_NAME(dm_mid.OBJECT_ID,dm_mid.database_id) + '_'
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.equality_columns,''),', ','_'),'[',''),']','')
+ CASE
WHEN dm_mid.equality_columns IS NOT NULL
AND dm_mid.inequality_columns IS NOT NULL THEN '_'
ELSE ''
END
+ REPLACE(REPLACE(REPLACE(ISNULL(dm_mid.inequality_columns,''),', ','_'),'[',''),']','')
+ ']'
+ ' ON ' + dm_mid.statement
+ ' (' + ISNULL (dm_mid.equality_columns,'')
+ CASE WHEN dm_mid.equality_columns IS NOT NULL AND dm_mid.inequality_columns
IS NOT NULL THEN ',' ELSE
'' END
+ ISNULL (dm_mid.inequality_columns, '')
+ ')'
+ ISNULL (' INCLUDE (' + dm_mid.included_columns + ')', '') AS Create_Statement
FROM sys.dm_db_missing_index_groups dm_mig
INNER JOIN sys.dm_db_missing_index_group_stats dm_migs
ON dm_migs.group_handle = dm_mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details dm_mid
ON dm_mig.index_handle = dm_mid.index_handle
WHERE dm_mid.database_ID = DB_ID()
ORDER BY TableName, Avg_Estimated_Impact DESC