Dynamic Management Views 2: Nicht benutzte Indizes finden

Wollten Sie schon immer mal wissen, welche Indizes, die Sie mühsam in Ihren Datenbanken aufgebaut haben, wirklich benutzt werden? Nichts leichter als das, mit DMVs

Dabei hilft uns sys.dm_db_index_usage_stats. Dieser DMV zählt, welche Arten von Indexoperationen (scans, seeks, lookups, updates) wie oft mit welchem Index ausgeführt wurden, getrennt nach Benutzerabfragen und internen Abfragen, wie z.B. Statistics-Updates. Die Sicht wird geleert, wenn der Server startet oder eine Datenbank (z.B. durch detach/attach) beendet wird.

Das bedeutet auch, dass ein Index, der in dieser Sicht nicht vorkommt seit Server-/Datenbankstart nie benutzt wurde. Daraus kann man jetzt die folgende Abfrage bauen:

use MeineDatenbank

select

object_name(i.object_id), i.name, i.index_id
from sys.indexes i, sys.objects o
where i.index_id NOT IN (select s.index_id
from sys.dm_db_index_usage_stats s , sys.databases d
where s.object_id=i.object_id and 
i.index_id=s.index_id and 
s.database_id = d.database_id and
            d.database_id = DB_ID())
      and o.type = 'U'
and o.object_id = i.object_id
order by object_name(i.object_id) asc

Was tut diese Abfrage? Sie schaut einfach in sys.indexes, welche Indizes in der aktuellen Datenbank (DB_ID()) existieren und dann, welche davon nicht in sys.dm_db_index_usage_stats vorkommen. Ergo, noch nie (seit Serverstart) benutzt wurden. Die Abfrage könnte man jetzt optimieren, um nur von Benutzeranfragen benutzte Indizes zu berücksichtigen und z.B. Updates auszuschließen.

Gruß,
Steffen