Und mal wieder etwas zum Thema MS SQL Datenbanken. Hier ein Skript, welches die Auslastung/Nutzung von Indizes ermittelt. Jeder Index erhöht den Speicherbedarf, deswegen ist es manchmal sinnvoll zu schauen, ob die 100 Indizes wirklich benötigt werden. Hierfür kann man als Basis dieses Skript verwenden. ACHTUNG! Nur weil ein Index momentan nicht so häufig verwendet wird ist er auch überflüssig. Bitte mit Bedacht an das Thema heran gehen.
use MEINE_DATENBANK;
go
-- Abfrage zeigt die Anzahl der INSERTS, UPDATES und DELETES, die für jeden Index ausgeführt wurden.
SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
A.LEAF_INSERT_COUNT,
A.LEAF_UPDATE_COUNT,
A.LEAF_DELETE_COUNT
FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (db_id(),NULL,NULL,NULL ) A
INNER JOIN SYS.INDEXES AS I
ON I.[OBJECT_ID] = A.[OBJECT_ID]
AND I.INDEX_ID = A.INDEX_ID
WHERE OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1
-- Abfrage zeigt die Nutzung der Indizes an:
-- USER_SEEKS: Benutzung für SEEK-Vorgang - ist erstrebenswert, weil schnell
-- USER_SCANS: Scan bedeutet, mehrere Zeilen mussten durchsucht werden - möglichst vermeiden
-- USER_LOOKUPS: Index enthält nicht alle gesuchten Daten (nicht abdeckend), Zugriff auf Tabelle erforderlich
-- USER_UPDATES: wie oft wurde der Index geupdatet - Hinweis auf den Pflegeaufwand
-- Indexe, die weder USER_SEEKS, USER_SCANS oder USER_LOOKUPS aufweisen, werden nicht genutzt
SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
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
AND S.database_id = DB_ID()
-- Abfrage liefert kumulative Angaben über die Schreib- und Lesehäufigkeit der Daten- und Transaktionsdateien aller Datenbanken
SELECT
cast(DB_Name(a.database_id) as varchar) as Database_name,
b.physical_name, *
FROM
sys.dm_io_virtual_file_stats(null, null) a
INNER JOIN sys.master_files b ON a.database_id = b.database_id and a.file_id = b.file_id
ORDER BY Database_Name