Feststellen, ob ein Index erforderlich oder erforderlich ist


110

Ich habe ein Auto-Index-Tool in unserer MS SQL-Datenbank ausgeführt (ich habe ein Skript geändert, das von Microsoft stammt und die Indexstatistiktabellen untersucht - Automatische Indizierung ). Aus den Statistiken habe ich jetzt eine Liste mit Empfehlungen für Indizes, die erstellt werden müssen.

Bearbeiten: Die oben beschriebenen Indizes beziehen Informationen aus den DMVs, aus denen hervorgeht, was das Datenbankmodul für Indizes verwenden würde, wenn diese verfügbar wären, und die Skripte übernehmen die Top x-Empfehlungen (nach Suchanfragen, Auswirkungen auf den Benutzer usw.) und fügen diese in eine Tabelle ein.

(Bearbeiten Sie den obigen Teil der Antwort von Larry Coleman, um zu verdeutlichen, was die Skripte tun.)

Da ich für den Datenbankadministrator neu bin und eine schnelle Suche im Internet durchgeführt habe, zögere ich, den Sprung zu wagen und die empfohlenen Indizes blind hinzuzufügen. Da ich jedoch keine Erfahrung auf diesem Gebiet habe, suche ich nach Ratschlägen, um festzustellen, ob die Empfehlungen notwendig sind oder nicht.

Muss ich den SQL Profiler ausführen oder ist es besser, den Code zu untersuchen, der die Tabellen abfragt? Und hast du noch andere Ratschläge?


1
Schauen Sie sich diesen Artikel an sqlserverperformance.wordpress.com/2007/11/29/…
Igor

Auf nicht verwendbare Indizes prüfen. Der Artikel könnte Ihnen helfen: sqlshack.com/…
Shiwangini Shishulkar

Antworten:


80

Ich verwende die Indexanalyseskripte von Jason Strate (alter Speicherort) . Sie geben an, wie häufig Ihre vorhandenen Indizes verwendet werden und wie häufig fehlende Indizes verwendet worden wären. Normalerweise füge ich keine Indizes hinzu, es sei denn, sie machen mehr als 5 oder 10% der Abfragen in einer Tabelle aus.

Am wichtigsten ist jedoch, dass sichergestellt wird, dass die Anwendung für die Benutzer schnell genug reagiert.

Update: Jason Strates Blog-Artikel zur Indexanalyse für neuere Skripte (Neuer Speicherort)

Doppelte Aktualisierung: In diesen Tagen verwende ich sp_BlitzIndex® bei der Indexanalyse .


Welche Änderungen müssen wir vornehmen, um alle Tabellen zu analysieren?
MonsterMMORPG

1
sp_BlitzIndex betrachtet alle Tabellen ab einer bestimmten Größe. Sie müssen sich die Dokumentation ansehen, um zu sehen, wie Sie sie anpassen können.
Jeremiah Peschka

Die Parameter für die Ausführung von sp_BlitzIndex sind hier: brentozar.com/blitzindex
JackArbiter 31.01.17

irgendein dreifaches Update?
Simon_Weaver

49

Es gibt einige Konzepte und Begriffe, die beim Umgang mit Indizes unbedingt zu verstehen sind. Suchen, Scannen und Nachschlagen sind einige der Methoden, mit denen Indizes über ausgewählte Anweisungen verwendet werden. Die Selektivität von Schlüsselspalten ist ein wesentlicher Faktor für die Bestimmung, wie effektiv ein Index sein kann.

Eine Suche findet statt, wenn das SQL Server-Abfrageoptimierungsprogramm feststellt, dass Sie die angeforderten Daten am besten finden, indem Sie einen Bereich innerhalb eines Index durchsuchen. Suchvorgänge treten normalerweise auf, wenn eine Abfrage von einem Index "abgedeckt" wird. Dies bedeutet, dass die Suchprädikate im Indexschlüssel und die angezeigten Spalten entweder im Schlüssel oder im Schlüssel enthalten sind. Ein Scanvorgang findet statt, wenn das SQL Server-Abfrageoptimierungsprogramm feststellt, dass die Daten am besten gefunden werden, indem der gesamte Index durchsucht und anschließend die Ergebnisse gefiltert werden. Eine Suche wird normalerweise durchgeführt, wenn ein Index nicht alle angeforderten Spalten enthält, weder im Indexschlüssel noch in den enthaltenen Spalten. Das Abfrageoptimierungsprogramm verwendet dann entweder den gruppierten Schlüssel (gegen einen gruppierten Index) oder die RID (gegen einen Heap), um die anderen angeforderten Spalten nachzuschlagen.

Suchvorgänge sind in der Regel effizienter als Scans, da ein kleinerer Datensatz physisch abgefragt wird. Es gibt Situationen, in denen dies nicht der Fall ist, z. B. ein sehr kleiner Anfangsdatensatz, der jedoch den Rahmen Ihrer Frage sprengt.

Nun haben Sie gefragt, wie Sie die Effektivität eines Index bestimmen können, und dabei sind einige Dinge zu beachten. Die Schlüsselspalten eines Clustered-Index werden als Clustering-Schlüssel bezeichnet. Auf diese Weise werden Datensätze im Kontext eines Clustered-Index eindeutig gemacht. Alle nicht gruppierten Indizes enthalten standardmäßig den gruppierten Schlüssel, um bei Bedarf Suchvorgänge durchzuführen. Alle Indizes werden für jede DML-Anweisung in die DML-Anweisung eingefügt, auf diese aktualisiert oder daraus gelöscht. Trotzdem ist es am besten, die Leistungssteigerung in ausgewählten Anweisungen gegen die Leistungseinbußen in Einfüge-, Lösch- und Aktualisierungsanweisungen abzugleichen.

Um festzustellen, wie effektiv ein Index ist, müssen Sie die Selektivität Ihrer Indexschlüssel bestimmen. Die Selektivität kann als Prozentsatz der einzelnen Datensätze zur Gesamtzahl der Datensätze definiert werden. Wenn ich eine [person] -Tabelle mit 100 Datensätzen habe und die [first_name] -Spalte 90 verschiedene Werte enthält, können wir sagen, dass die [first_name] -Spalte zu 90% selektiv ist. Je höher die Selektivität, desto effizienter ist der Indexschlüssel. Unter Berücksichtigung der Selektivität ist es am besten, die selektivsten Spalten zuerst in den Indexschlüssel aufzunehmen. Was wäre, wenn wir in meinem vorherigen Beispiel [person] eine Spalte [last_name] hätten, die zu 95% selektiv wäre? Wir möchten einen Index mit [Nachname], [Vorname] als Indexschlüssel erstellen.

Ich weiß, dass dies eine etwas langwierige Antwort war, aber es gibt wirklich eine Menge Dinge, die bestimmen, wie effektiv ein Index sein wird, und eine Menge Dinge, mit denen Sie Leistungsgewinne abwägen müssen.


1
Ich möchte nur betonen, was oben gesagt wurde: Indizes verlangsamen Ihre Einfügungen / Löschungen und Aktualisierungen. Wenn Sie sagen müssen, dass Sie eine große Datenmenge in großen Mengen einfügen müssen, sind Sie ohne den Index besser dran (Sie können ihn später erstellen, er ist schneller).
Nicolas de Fontenay

Wäre es richtig zu erwähnen, dass der Index für die Spalten [Nachname], [Vorname] nur verwendet werden kann, wenn die Abfrage nach Nachname und Vorname filtert? Wenn nur nach Vorname gefiltert wird, kann der Index nicht verwendet werden.
Magier

Gute Antwort - Selektivität ist wichtiger als Kardinalität bei der Entscheidung, ob ein Index erstellt werden soll
Reversed Engineer

27

Ich habe kürzlich ein fantastisches kostenloses Skript von den Leuten bei BrentOzar Unltd entdeckt. Http://www.brentozar.com/blitzindex/

Auf diese Weise können Sie gut analysieren, welche Indizes vorhanden sind, wie oft sie verwendet werden und wie oft das Abfragemodul nach einem nicht vorhandenen Index sucht.

Die Anleitung ist im Allgemeinen gut. Manchmal wird es ein bisschen zu suggestiv für Ideen. Bisher habe ich im Allgemeinen Folgendes getan:

  • Entfernte Indizes, die NIE gelesen wurden (oder weniger als 50 Mal im Monat).
  • Es wurden die offensichtlichsten Indizes zu Fremdschlüsseln und Feldern hinzugefügt, von denen ich weiß, dass sie häufig verwendet werden.

Ich habe nicht alle empfohlenen Indizes hinzugefügt und habe eine Woche später festgestellt, dass sie nicht mehr empfohlen werden, da die Abfrage-Engine stattdessen einige der anderen neuen Indizes verwendet!

Generell sollten Sie Indizes vermeiden auf:

  • Sehr kleine Tabellen (weniger als 50 bis 200 Datensätze): Oft ist die Abfrage-Engine schneller, wenn sie die Tabelle durchsucht, anstatt den Index zu laden, zu lesen, zu verarbeiten usw.
  • Vermeiden Sie Indizes für Spalten mit niedriger Kardinalität ( http://en.wikipedia.org/wiki/Cardinality_(SQL_statements) ) in der zuerst genannten Spalte. ZB ist das Indizieren eines Geschlechtsfeldes (M / W) von sehr geringem Nutzen. Es ist genauso praktisch, die Tabelle zu scannen und die ~ 50% zu finden, die übereinstimmen. Wenn es nach etwas Bestimmtem im Index aufgeführt ist (z. B. [Geburtsdatum, Geschlecht]), das besser ist, möchten Sie möglicherweise, dass alle Männchen in einer bestimmten Zeitspanne geboren werden.

Clustered-Indizes sind gut - normalerweise basieren sie auf Ihrem Primärschlüssel. Sie helfen dem Datenbankmodul dabei, die Daten auf der Festplatte in die richtige Reihenfolge zu bringen. Es ist sehr wichtig, dies für die größten Tabellen zu verstehen, da ein guter Clustered-Index häufig den von der Tabelle belegten Platz verringert.

Ich habe einige Tabellen von 900 MB auf 400 MB reduziert, nur weil es sich zuvor um unstrukturierte Haufen handelte. http://msdn.microsoft.com/en-us/library/aa933131(v=sql.80).aspx

Neu organisieren / neu aufbauen

Sie sollten nach fragmentierten Indizes suchen. Ein bisschen Fragmentierung ist in Ordnung, sei nicht besessen! http://technet.microsoft.com/en-us/library/ms189858.aspx Erkennen Sie den Unterschied zwischen Neuorganisation und Neuaufbau!

Regelmäßig überprüfen

Abfragen ändern sich, Datenmengen ändern sich, neue Funktionen werden hinzugefügt, alte werden entfernt. Sie sollten sie einmal im Monat ansehen (oder öfter, wenn Sie große Mengen haben) und suchen, wo Sie der Datenbank helfen können!

Wie viele

In einem aktuellen Video empfiehlt Brent (normalerweise), nicht mehr als 5 Indizes für eine Tabelle mit viel Schreibarbeit (z. B. Auftragstabelle) und nicht mehr als 10 zu verwenden, wenn viel mehr gelesen als geschrieben wird (z. B. Protokollierungstabelle für Analysen). Http: / /www.youtube.com/watch?v=gOsflkQkHjg

Insgesamt

Es hängt davon ab, ob!

Ihr Kilometerstand variiert je nach Datenbank. Decken Sie das offensichtliche (Name des Mitarbeiters, Bestelldatum usw.) auf Ihren (jetzt / zukünftigen) größeren Tischen ab. Überwachen, überprüfen und gegebenenfalls anpassen. Es sollte Teil Ihrer Routine-Checkliste sein, wenn Sie Ihre Datenbank (en) verwalten :)

Hoffe das hilft!


14

Normalerweise muss man eine bestimmte Arbeitslast (Abfragen) haben und die Auswirkung jedes neuen Index auf die Arbeitslast sorgfältig testen. Dieser iterative Prozess sollte immer eine sorgfältige Analyse der Ausführungspläne umfassen, um zu ermitteln, welche Indizes verwendet werden. Das Thema zum Analysieren einer Abfrage ist langwierig, und es empfiehlt sich, mit dem dedizierten MSDN-Kapitel Analysieren einer Abfrage zu beginnen .

Manchmal, wenn die Arbeitslast zu komplex ist oder die Kenntnisse des Datenbankentwurfs nicht ausreichend sind, wird der Datenbankoptimierungsratgeber verwendet , der eine automatische Analyse Ihrer Arbeitslast durchführt und einige Indizes vorschlägt. Die Vorschläge sollten natürlich sorgfältig analysiert und die Auswirkungen sofort gemessen werden.

Wenn Sie also meiner Idee folgen, einen Index hinzuzufügen und die Auswirkung zu messen, ist das eigentlich nur ein Fall von A / B-Tests : Sie führen Ihre Arbeitslast ohne den Index als Basislinie aus und führen sie dann mit dem Index aus, messen und vergleichen mit der Basislinie vergleichen und dann anhand der beobachteten und gemessenen Metriken entscheiden, ob die Auswirkung von Vorteil ist. Das Workload ist am besten eine Test-Suite von guter Qualität, es kann aber auch eine Wiedergabe eines erfassten Workloads sein, siehe Gewusst wie: Wiedergeben einer Ablaufverfolgungsdatei .

Eine synthetischere Antwort ist es, die sys.dm_db_index_usage_statsAnsicht zu betrachten und zu sehen, wie Indizes verwendet werden. Dies ist jedoch normalerweise ein Ansatz für die Analyse vor Ort bei unbekannter Arbeitsbelastung (dh ein zu Hilfe gerufener Berater würde wahrscheinlich damit beginnen).


7

Ab SQL 2005 verfügt SQL Server über DMVs , die Ihnen mitteilen, was das Datenbankmodul für Indizes verwenden würde, wenn diese verfügbar wären. In den Ansichten können Sie sehen, welche Spalten Schlüsselspalten sein sollen, welche Spalten enthalten sein sollen und vor allem, wie oft der Index verwendet worden wäre.

Ein guter Ansatz wäre, die Abfrage der fehlenden Indizes nach der Anzahl der Suchvorgänge zu sortieren und zuerst die obersten Indizes hinzuzufügen.

Siehe auch: die offiziellen MS DMV-Dokumente


-1

Es hängt davon ab, wie diese Tabelle verwendet wird. Nehmen wir zum Beispiel an, ich habe eine Tabelle, die oft gelesen wird, aber Aktualisierungen und Einfügungen sind selten. Außerdem frage ich immer die Tabelle in einer Fremdschlüsselspalte ab. Es ist sinnvoll, einen (nicht gruppierten) Index für diesen Fremdschlüssel zu erstellen, um Leseabfragen zu beschleunigen. Der Nachteil ist jedoch, dass Ihr Insert-Update langsam wird.

Es gibt nur wenige statistische Abfragen, die angeben, wie viel Zeit Abfragen in Anspruch nehmen. Beginnen Sie mit den langsamsten. Wenn das Abfrageprädikat keinen Index hat, hilft das Erstellen eines Index.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.