Frage

Welche Methoden gibt es, um überflüssige Spalten in abdeckenden Indizes zu identifizieren:Spalten, die niemals durchsucht werden und daher in Includes extrahiert oder sogar vollständig entfernt werden können, ohne die Anwendbarkeit des Index zu beeinträchtigen?

War es hilfreich?

Lösung

Um Dinge zu klären
Die Idee von ein abdeckender Index ist, dass es auch Spalten enthält, nach denen möglicherweise nicht gesucht wird (die in der WHERE-Klausel usw. verwendet werden), die jedoch ausgewählt werden können (Teil der SELECT-Spaltenliste).

Es scheint keine einfache Möglichkeit zu geben, die Existenz ungenutzter Spalten in einem abdeckenden Index festzustellen.Ich kann mir nur den folgenden mühsamen Prozess vorstellen:

  • Zeichnen Sie für einen repräsentativen Zeitraum alle Abfragen auf, die auf dem Server (oder in der gewünschten Tabelle) ausgeführt werden.
  • Filtern Sie Abfragen (durch reguläre Ausdrücke) heraus, die nicht die zugrunde liegende Tabelle betreffen
  • Für verbleibende Abfragen besorgen Sie sich den Abfrageplan.Abfragen verwerfen, die den betreffenden Index nicht betreffen
  • Erstellen Sie für die verbleibenden Abfragen bzw. für jede Abfrage-„Vorlage“ (viele Abfragen sind bis auf die Werte der Suchkriterien gleich) eine Liste der Spalten aus dem Index, die sich entweder in der Select- oder Where-Klausel (oder in JOIN) befinden. .)
  • Die Spalten aus dem Index, die in dieser Liste nicht gefunden werden, sind definitiv einsatzbereit.

Jetzt sind möglicherweise noch ein paar [Spalten zu entfernen], da der obige Prozess nicht prüft, in welchem ​​Kontext der abdeckende Index verwendet wird (es ist möglich, dass er zum Auflösen des Wo verwendet wird, aber dass weiterhin auf die zugrunde liegende Tabelle zugegriffen wird auch (um beispielsweise zu Spalten zu gelangen, die nicht im abdeckenden Index enthalten sind ...)

Der obige klinische Ansatz ist eher unattraktiv. Ein analytischer Ansatz kann vorzuziehen sein:

Finden Sie alle Abfragevorlagen, die in allen Anwendungen verwendet werden können, die den Server verwenden.Suchen Sie für jedes dieser Muster diejenigen, die möglicherweise den abdeckenden Index verwenden.Dies sind (wieder ein paar Lücken...) Abfragen, die:

  • Fügen Sie einen Verweis auf die zugrunde liegende Tabelle hinzu
  • Zitieren Sie in keiner Weise eine Spalte aus der zugrunde liegenden Tabelle, die keine Spalte im Index ist
  • Verwenden Sie kein Suchkriterium aus der zugrunde liegenden Tabelle, das selektiver ist als die Spalten des Index (in ihrer Reihenfolge ...).

Oder...ohne überhaupt zu den Anwendungen zu gehen: Denken Sie an alle Anwendungsfälle, und wenn Abfragen, die diese Fälle bedienen würden, nicht von allen Spalten im Index profitieren würden.Dies würde bedeuten, dass Sie eine relativ gute Vorstellung von der Selektivität des Index in Bezug auf seine ersten Spalten haben.

Andere Tipps

Wenn Sie Audits Ihre Anwendungsfälle und Datenpunkte zu tun, natürlich alles, was in der Prüfung nicht verwendet oder gefangen wird, ist ein Kandidat für die Löschung. Wenn die Datenbank eine solche gründliche Prüfung fehlt, können Sie ein Zeitfenster im Wert von Abfragen speichern, die die Datenbank getroffen, indem eine Spur läuft und es zu speichern. Sie können die Trace analysieren und sehen, welche Art von Abfragen auf die Datenbank schlagen und von dort intuit die Spalten können gelöscht werden.

Spurenanalyse wird normalerweise verwendet, Kandidaten zu finden fehlt Indizes, aber ich glaube, dass es auch Nutzungstrends verwendet werden könnte, zu analysieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top