Senaste tiden har jag suttit en hel del med underhåll, övervakning och komprimering av index. Jag upptäckte i en miljö att det fanns ett helt gäng index som enligt statistics aldrig hade använts. Att på ett snabbt sätt få reda på hur frekvent index används finns en jättebra standardrapport som man enkelt kör via Standard Reports i Management Studion. Dessvärre får man där inget grepp på hur stora respektive index är.

Något jag var intresserad var hur mycket utrymme jag skulle spara om jag tog bort de index som aldrig hade använts.
För att få reda på det behövde jag joina lite olika tabeller.
För att det är fredag delar jag helt gratis med mig av skriptet.
select
o.name as [Tabel_name],
i.name as [Index_name],
8 *SUM(a.used_pages)as Index_size
FROMsys.indexes i
JOINsys.objects o ON i.object_id= o.object_id
LEFTOUTERJOINsys.partitions p ON p.object_id= i.object_idand p.index_id = i.index_id
LEFTOUTERJOINsys.allocation_units a ON a.container_id = p.partition_id
LEFTOUTERJOINsys.dm_db_index_usage_stats s ON i.object_id= s.object_idand i.index_id = s.index_id
Where
— Bara index i ”användartabeller”
o.[type] =’u’
— Clustered och Non-Clustered index
AND i.[type] IN(1,2)
— Indexes utan statistik
AND(s.index_id ISNULL)
— Indexes som blivit uppdaterade men inte använda
OR(s.user_seeks = 0 AND s.user_scans = 0 AND s.user_lookups = 0 )
Groupby o.name,i.name