TSQL Server-Uptime & Index-Usage

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

Leave a Reply

Your email address will not be published. Required fields are marked *

*