Best Practices für nicht verwendete Indizes

11

Basierend auf dieser Abfrage, wenn ich eine geringe Anzahl von Gesamtlesevorgängen (sehr nahe an 0 oder 0, wie 1 oder 2) und eine hohe oder moderate Anzahl von Benutzeraktualisierungen (ich konnte mit dieser Abfrage keine Einfügungen oder Löschungen finden) mit sehe Bei einer großen Zeilenanzahl sollte ich theoretisch den Index entfernen.

SELECT DISTINCT
    OBJECT_NAME(s.[object_id]) AS ObjectName
       , p.rows TableRows
       , i.name AS [INDEX NAME]
       , (user_seeks + user_scans + user_lookups) AS TotalReads
       , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
        AND i.index_id = s.index_id 
    INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
       AND s.database_id = DB_ID()
       AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

Ich möchte hier die Richtigkeit dieser Annahme überprüfen. Zum Beispiel scheint ein Index, der seit über einem Jahr existiert, aber nie gelesen, aber stark aktualisiert wurde, eine schlechte Idee zu sein. Gibt es ein Szenario, in dem diese Annahme ungültig ist?

DoubleVu
quelle

Antworten:

15

Diese DMV verwaltet nur Statistiken seit dem letzten Neustart von SQL Server. Die Ansicht wird vollständig gelöscht und alles beginnt von vorne.

Noch wichtiger ist, dass die Zeilen in dieser Ansicht für einen bestimmten Index entfernt werden, wenn dieser Index neu erstellt wird (jedoch nicht, wenn er neu organisiert wird). Wenn Sie eine regelmäßige Indexwartung durchführen, kann es hilfreich sein, in den Wartungsprotokollen nachzusehen, ob einer der Indizes, die Sie löschen möchten, möglicherweise kürzlich neu erstellt wurde.

Es ist daher möglicherweise nicht ratsam, Entscheidungen zu treffen, die auf niedrigen Lesevorgängen seit dem letzten Neustart basieren, wenn der letzte Neustart möglicherweise für die Patch-Dienstag-Updates der letzten Woche oder das gestrige Service Pack durchgeführt wurde. Oder wenn Sie seit der letzten Neuerstellung eine Indexpflege durchführen. Möglicherweise gibt es einen Bericht, der nur einmal im Monat, einmal im Quartal oder einmal im Jahr erstellt wird und von einer wichtigen und ungeduldigen Person erstellt wird.

Außerdem könnte ein Index für etwas vorhanden sein, das in Zukunft passieren wird und von dem Sie nichts wissen - eine Reihe von Berichten, die für die Steuersaison vorbereitet werden, sagen wir.

Mein Rat ist also:

Verwenden Sie die DMV, um Kandidatenindizes zu identifizieren , die entfernt werden sollen , aber treffen Sie diese Entscheidung nicht in einer Blase. Sie müssen die Vorbereitungen treffen, um festzustellen, warum ein Index möglicherweise vorhanden ist, bevor Sie ihn löschen, auch wenn es so aussieht, als würde er derzeit nicht verwendet .

Aaron Bertrand
quelle
@AaronBertrand Wäre das Verfolgen eines Verlaufs (zusammen mit dem Zeitpunkt des letzten Neustarts) eine gute Ergänzung dazu? Danke für deine Antwort.
DoubleVu
1
@DoubleVu Ja, es lohnt sich wahrscheinlich, Snapshots des Indexnutzungsverlaufs zu verwalten, damit Sie fundierte Entscheidungen treffen können, die von nichts beeinflusst werden, was die Ausgabe der Nutzungsstatistik DMV verändern könnte.
Aaron Bertrand
2

Ja, die Ansicht enthält nur Statistiken seit dem letzten Neustart. Um zu vermeiden, dass ich einen Job eingerichtet habe, bei dem eine Abfrage ausgeführt wurde, wie Sie sie monatlich am Morgen vor Beginn unseres Wartungsfensters veröffentlicht haben, um die Informationen jeden Monat vor dem Neustart des Servers zu erfassen. Dadurch konnte ich weiter zurückgehen und Trends im Laufe der Zeit betrachten. Ich hatte auch eine zweite Abfrage, die nach möglicherweise fehlenden Indizes suchte.

Eine andere zu berücksichtigende Sache ist, welche anderen Indizes auf dem Tisch sind. Es wird möglicherweise nicht verwendet, da es sich größtenteils oder vollständig um ein Duplikat eines anderen Index handelt. Ja. Mit SQL Server können Sie zwei verschiedene, aber identische Indizes erstellen, sodass diese möglicherweise vollständig redundant sind.

Sie können sich auch ansehen, wie der Abfrageplan für eine Abfrage aussehen könnte, die diesen Index verwendet, wenn dieser Index entfernt wurde. Hätte es einen anderen zu verwendenden Index oder müsste es wahrscheinlich auf einen vollständigen Tabellenscan zurückgreifen.

Indizes sind letztendlich genauso viel Kunst wie Wissenschaft, weil es wirklich schwierig ist, alles darüber zu wissen, was ausgeführt werden könnte, und es ändert sich sowieso häufig.

Evan Steinbrenner
quelle