In Datenbanken wächst die Anzahl der Indizes manchmal schneller als man denkt. Nach einer gewissen Zeit weiß man u.U. auch bei gutem Naming nicht mehr wofür man einen einzelnen Index braucht und ob er benützt wird.
Indizes beschleunigen das System aber nicht nur, sie belasten es auch – sie brauchen Platz und Zeit. Es ist also eine gute Idee von Zeit zu Zeit nicht mehr Benötigtes zu entsorgen. Also baut man in seine Applikation einen Logger ein der einmal am Tag die Index-Usage loggt. Lässt man das lange genug laufen (so dass alle “seltenen” Fälle mit abgedeckt sind) so hat man einen guten Hinweis darauf was umsonst ist und was nicht.
Im MSSQL-Server werden die Daten nur temporär geschrieben, ein Server-Neustart führt dazu dass die Daten verloren gehen. Also sind die Daten vom Anfang “eh für die Katz”.
Wie ermittelt man nun diese beiden Dinge?
Ganz einfach, nämlich so ….
Letzter Server-Start:
SELECT crdate FROM sysdatabases WHERE NAME='tempdb'
Index-Usage:
SELECT OBJECT_SCHEMA_NAME(S.OBJECT_ID)+ '.' + OBJECT_NAME(S.OBJECT_ID ) AS TabellenName, I.NAME AS IndexName, USER_SEEKS AS Seeks, USER_SCANS AS Scans, USER_LOOKUPS AS Lookups FROM SYS.DM_DB_INDEX_USAGE_STATS AS S INNER JOIN SYS.INDEXES AS I ON I. OBJECT_ID = S. OBJECT_ID AND I.INDEX_ID = S.INDEX_ID WHERE OBJECTPROPERTY(S. OBJECT_ID ,'IsUserTable') = 1 -- nur eigene Tabellen ORDER BY user_seeks+user_scans+user_lookups DESC -- die die irgendeinen Zugriff haben nach oben