Löschen nicht verwendeter Indizes - Bewertung der unerwarteten Gefahren

16

Wir haben eine sehr große Datenbank mit Hunderten von nicht verwendeten Indizes gemäß DMV-Statistiken, die sich seit dem letzten Neustart des Servers im Juli angesammelt haben. Einer unserer Datenbankadministratoren gab die folgenden warnenden Erklärungen ab, die für mich keinen Sinn ergeben:

  1. Bevor wir einen Index löschen, müssen wir sicherstellen, dass er keine Eindeutigkeitsbeschränkung erzwingt, da der Abfrageoptimierer diesen Index möglicherweise benötigt.
  2. Immer wenn ein Index erstellt wird, werden Statistiken zu diesem Index auch in SQL Server erstellt. Eine Abfrage verwendet möglicherweise nicht den Index, aber möglicherweise die Statistik. Es kann also vorkommen, dass nach dem Löschen eines Index eine bestimmte Abfrageleistung sehr schlecht ist. SQL Server speichert die Nutzungsstatistik nicht. Obwohl die Funktion "Automatisch Statistiken erstellen" in unserer Datenbank aktiviert ist, weiß ich nicht, welche Parameter intern erfüllt werden müssen, bevor das Abfrageoptimierungsprogramm die fehlenden Statistiken erstellt.

In Bezug auf Nummer 1 scheint es mir, als würde SQL Server tatsächlich nach dem Index suchen, um die Eindeutigkeit zu bestimmen, bevor eine Einfügung / Aktualisierung durchgeführt wird, und daher würde der Index nicht als nicht verwendet angezeigt.

Ist dies in Bezug auf Nummer 2 wirklich möglich?

Übrigens, wenn ich sage, dass kein Index verwendet wird, meine ich keine Suchvorgänge und keine Scans.

Randy Minder
quelle
3
Ich empfehle Ihnen, den Index zu deaktivieren, wenn Sie absolut sicher sind, dass dieser Index nicht verwendet wird, selbst wenn Jahresendberichte erstellt werden.
Kin Shah

Antworten:

17

Die Bedenken Ihres DBAs sind beide berechtigt.

In Bezug auf Nummer 1 scheint es mir, als würde SQL Server tatsächlich nach dem Index suchen, um die Eindeutigkeit zu bestimmen, bevor eine Einfügung / Aktualisierung durchgeführt wird, und daher würde der Index nicht als nicht verwendet angezeigt.

Die Eindeutigkeitsgarantie kann vom Optimierer verwendet werden, um zu entscheiden, welche logischen Transformationen oder physischen Operationen verwendet werden können, um korrekte Ergebnisse zu erzielen. Die Tatsache, dass das Optimierungsprogramm sich auf eine Eindeutigkeitsgarantie stützt, um beispielsweise eine Aggregation zu transformieren oder einen Eins-zu-Viele-Merge-Join auszuwählen, wird in der Indexverwendungsstatistik nicht berücksichtigt, es sei denn, im endgültigen Ausführungsplan wird auch physisch auf den Index zugegriffen . Man sollte daher sehr vorsichtig sein, um eindeutige Indizes oder Einschränkungen zu entfernen (oder zu deaktivieren).

Ist dies in Bezug auf Nummer 2 wirklich möglich?

Ja, das Optimierungsprogramm kann mit einem Index verknüpfte Statistiken verwenden, ohne dass der endgültige Ausführungsplan einen Zugriff über diesen Index enthält. Das Laden 'interessanter' Statistiken, das Berechnen von Kardinalitätsschätzungen und das Erstellen eines fertigen Ausführungsplans sind völlig unabhängige Vorgänge.

Wenn Sie den Index löschen, werden auch die zugehörigen Indexstatistiken entfernt, was sich auf die Planqualität auswirken kann, wenn die Anweisung das nächste Mal neu kompiliert wird. Die Index - Statistiken können in einer Mächtigkeit Schätzung Berechnung verwendet werden , dass der endgültige Plan stützt sich auf, auch wenn der Index in dem endgültigen Plan nicht physisch vorhanden ist.

Ihr DBA kennt sich aus.

Nichts davon sollte bedeuten, dass anscheinend nicht verwendete Indizes niemals entfernt werden sollten. Ich sage nur, dass die Bedenken Ihres DBAs berechtigt sind, und Sie sollten die Änderung entsprechend planen, mit geeigneten Tests und einem Wiederherstellungsplan. Nach meiner Erfahrung ist Punkt 1 mit größerer Wahrscheinlichkeit problematisch als Punkt 2, aber ich habe keine Möglichkeit zu wissen, ob dies auf Ihre Situation zutrifft.

Paul White sagt GoFundMonica
quelle