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

         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