it-swarm.com.de

So stellen Sie fest, ob ein Index erforderlich oder erforderlich ist

Ich habe ein Auto-Index-Tool für unsere MS SQL-Datenbank ausgeführt (ich habe ein von Microsoft stammendes Skript geändert, das sich die Indexstatistiktabellen ansieht - Automated Auto Indexing ). Aus den Statistiken habe ich jetzt eine Liste mit Empfehlungen für Indizes, die erstellt werden müssen.

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

(Bearbeiten Sie oben teilweise aus Larry Colemans Antwort unten, um zu verdeutlichen, was die Skripte tun.)

Da ich neu im Datenbankadministrator bin und eine schnelle Suche im Internet durchgeführt habe, zögere ich, den Sprung zu wagen und blind die empfohlenen Indizes 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?

112
misterjaytee

Ich benutze Jason Strates Indexanalyseskripte (alter Ort) . Sie geben an, wie oft Ihre vorhandenen Indizes verwendet werden und wie viel 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 die Anwendung schnell genug für die Benutzer reagiert.

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

Double Update: Heutzutage verwende ich sp_BlitzIndex® , wenn ich eine Indexanalyse durchführe.

81

Es gibt einige Konzepte und Begriffe, die beim Umgang mit Indizes wichtig sind. Suchen, Scannen und Nachschlagen sind einige der Möglichkeiten, wie Indizes durch 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 der beste Weg zum Auffinden der angeforderten Daten das Scannen eines Bereichs innerhalb eines Index ist. Suchvorgänge treten normalerweise auf, wenn eine Abfrage von einem Index "abgedeckt" wird. Dies bedeutet, dass sich die Suchprädikate im Indexschlüssel befinden und die angezeigten Spalten entweder im Schlüssel enthalten oder enthalten sind. Ein Scan wird durchgeführt, wenn das SQL Server-Abfrageoptimierungsprogramm feststellt, dass der beste Weg zum Auffinden der Daten darin besteht, den gesamten Index zu scannen und dann die Ergebnisse zu filtern. Eine Suche erfolgt normalerweise, wenn ein Index nicht alle angeforderten Spalten enthält, weder im Indexschlüssel noch in den enthaltenen Spalten. Das Abfrageoptimierungsprogramm verwendet dann entweder den Clustered Key (gegen einen Clustered Index) oder die RID (gegen einen Heap), um die anderen angeforderten Spalten zu "suchen".

In der Regel sind Suchvorgänge 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 über den Rahmen Ihrer Frage hinausgeht.

Nun haben Sie gefragt, wie Sie feststellen können, wie effektiv ein Index ist, und es gibt 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 nachschlagen zu können. Alle Indizes werden für jede jeweilige DML-Anweisung in diese eingefügt, in diese aktualisiert oder aus dieser gelöscht. Trotzdem ist es am besten, Leistungssteigerungen in ausgewählten Anweisungen gegen Leistungstreffer in Anweisungen zum Einfügen, Löschen und Aktualisieren abzuwägen.

Um festzustellen, wie effektiv ein Index ist, müssen Sie die Selektivität Ihrer Indexschlüssel bestimmen. Die Selektivität kann als Prozentsatz unterschiedlicher Datensätze zur Gesamtzahl der Datensätze definiert werden. Wenn ich eine [person] -Tabelle mit insgesamt 100 Datensätzen habe und die Spalte [first_name] 90 verschiedene Werte enthält, können wir sagen, dass die Spalte [first_name] zu 90% selektiv ist. Je höher die Selektivität, desto effizienter der Indexschlüssel. Unter Berücksichtigung der Selektivität ist es am besten, die selektivsten Spalten in Ihrem Indexschlüssel an die erste Stelle zu setzen. Was wäre, wenn wir anhand meines vorherigen Beispiels [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 viele Dinge, die bestimmen, wie effektiv ein Index sein wird, und viele Dinge, gegen die Sie Leistungsgewinne abwägen müssen.

51
Matt M

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

Auf diese Weise wird gut analysiert, welche Indizes vorhanden sind, wie oft sie verwendet werden und wie oft die Abfrage-Engine nach einem nicht vorhandenen Index sucht.

Die Anleitung ist im Allgemeinen gut. Manchmal werden Ideen etwas übertrieben. Bisher habe ich im Allgemeinen Folgendes getan:

  • Indizes, die NIE gelesen wurden (oder weniger als 50 Mal im Monat), wurden entfernt.
  • Es wurden die offensichtlichsten Indizes für Fremdschlüssel und Felder hinzugefügt, von denen ich weiß, dass wir sie häufig verwenden.

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

Im Allgemeinen sollten Sie Indizes vermeiden für:

  • Sehr kleine Tabellen (weniger als 50 bis 200 Datensätze): Oft ist die Abfrage-Engine schneller, wenn sie die Tabelle scannt, 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 erstgenannten Spalte. Z.B. Das Indizieren eines Geschlechterfelds (M/F) ist sehr wenig nützlich. Es ist genauso praktisch, die Tabelle zu scannen und die ~ 50% zu finden, die übereinstimmen. Wenn es nach etwas Spezifischerem im Index aufgeführt ist (z. B. [Geburtsdatum, Geschlecht]), das besser ist, möchten Sie möglicherweise, dass alle Männer in einem bestimmten Zeitraum geboren werden.

Clustered-Indizes sind gut - normalerweise basieren diese auf Ihrem Primärschlüssel. Sie helfen dem Datenbankmodul, die Daten in einem guten Zustand auf die Festplatte zu bringen. Es ist sehr wichtig, dies für die größten Tabellen zu verstehen, da ein guter Clustered-Index häufig den Platz reduziert, den die Tabelle einnimmt.

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

Neu organisieren/neu erstellen

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

Regelmäßig überprüfen

Abfragen ändern sich, Datenmengen ändern sich, neue Funktionen werden hinzugefügt, alte entfernt. Sie sollten sie sich 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 kürzlich veröffentlichten Video empfiehlt Brent (normalerweise) nicht mehr als 5 Indizes für eine Tabelle mit viel Schrift (z. B. Auftragstabelle) und nicht mehr als 10, wenn viel mehr gelesen als geschrieben wird (dh 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 die offensichtlichen (Nachname des Mitarbeiters, Bestelldatum usw.) auf Ihren (jetzt/zukünftigen) größeren Tischen ab. Überwachen, überprüfen und nach Bedarf anpassen. Es sollte Teil Ihrer Routine-Checkliste sein, wenn Sie Ihre Datenbank (en) verwalten :)

Hoffe das hilft!

29
Greg Robson

Normalerweise geht man davon aus, eine bestimmte Arbeitslast (Abfragen) zu haben und die Auswirkungen jedes neuen Index auf die Arbeitslast sorgfältig zu testen. Dieser iterative Prozess sollte immer eine sorgfältige Analyse der Ausführungspläne beinhalten, aus der hervorgeht, welche Indizes verwendet werden. Das Thema der Analyse einer Abfrage ist langwierig, und beginnend mit dem dedizierten MSDN-Kapitel Analyse einer Abfrage ist eine gute Wahl.

Manchmal, wenn die Arbeitslast zu komplex ist oder das Wissen über das Datenbankdesign lückenhaft ist, verwendet man den Database Engine Tuning Advisor , 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, ist das Hinzufügen eines Index und das Messen der Auswirkungen nur ein Fall von A/B-Tests : Sie führen Ihre Workload ohne den Index als Basislinie aus, dann führen Sie sie aus Messen und vergleichen Sie mit dem Index mit der Basislinie und entscheiden Sie dann anhand der beobachteten und gemessenen Metriken, ob die Auswirkungen von Vorteil sind. Die Arbeitslast ist am besten eine Testsuite von guter Qualität, kann aber auch eine Wiederholung einer erfassten Arbeitslast sein, siehe Gewusst wie: Wiedergabe einer Trace-Datei .

Eine synthetischere Antwort ist das sys.dm_db_index_usage_stats anzeigen und sehen, wie Indizes verwendet werden, aber dies ist normalerweise ein Ansatz für die Analyse einer unbekannten Arbeitslast vor Ort (dh ein Berater, der um Hilfe gebeten wird, würde wahrscheinlich damit beginnen).

14
Remus Rusanu

Ab SQL 2005 verfügt SQL Server über DMV , die angeben, was das Datenbankmodul für Indizes verwenden würde, wenn sie verfügbar wären. In den Ansichten können Sie angeben, welche Spalten Schlüsselspalten sein sollten, welche Spalten enthalten sein sollten 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

8
Larry Coleman