So können Sie feststellen, 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 die Indexstatistiktabellen betrachtet - Automatisierte automatische Indexierung ). Aus den Statistiken habe ich nun eine Liste mit Empfehlungen für Indizes, die erstellt werden müssen.

    Bearbeiten: Die oben beschriebenen Indizes beziehen Informationen aus dem Index DMVs, die Ihnen sagen, was die Datenbank-Engine für Indizes verwenden würde, wenn sie verfügbar wären, und die Skripts nehmen die Top-x-Empfehlungen (nach Suchanfragen, Auswirkungen der Benutzer usw.) in eine Tabelle.

    (Bearbeiten oben teilweise aus der Antwort von Larry Coleman entnommen, um zu klären, was die Skripts tun)

    Da ich zum Datenbankadministrator noch neu bin, und habe Nachdem ich schnell im Netz gesucht hatte, zögere ich nur ungern den Sprung und füge blind die empfohlenen Indizes hinzu. Da ich jedoch nicht auf diesem Gebiet erfahren bin, suche ich nach Ratschlägen, wie man feststellen kann, 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 haben Sie noch andere Ratschläge?

    22 February 2013
    DBMore
5 answers
  • Es gibt einige Begriffe und Begriffe, die für den Umgang mit Indizes wichtig sind. Suchanfragen, Scans und Lookups sind einige der Möglichkeiten, wie Indizes durch select-Anweisungen verwendet werden. Die Selektivität der Schlüsselspalten ist entscheidend dafür, wie effektiv ein Index sein kann.

    Eine Suche wird ausgeführt, wenn das SQL Server Query Optimizer feststellt, dass die angeforderten Daten am besten gefunden werden können durch Scannen eines Bereichs innerhalb eines Index. 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 enthalten oder enthalten sind. Eine Prüfung findet statt, wenn das SQL Server Query Optimizer feststellt, dass die Daten am besten gefunden werden können, indem der gesamte Index durchsucht und die Ergebnisse anschließend gefiltert werden. Eine Suche tritt normalerweise auf, wenn ein Index nicht alle angeforderten Spalten enthält, entweder im Indexschlüssel oder in den enthaltenen Spalten. Das Abfrageoptimierungsprogramm verwendet dann entweder den gruppierten Schlüssel (für einen gruppierten Index) oder die RID (für einen Heap), um die anderen angeforderten Spalten "nachzuschlagen".

    Suchen Sie normalerweise nach Vorgängen sind 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 bestimmen sollen Ein Index ist effektiv, und es gibt einige Dinge, die zu beachten sind. Die Schlüsselspalten eines Clustered-Index werden als Clustering-Schlüssel bezeichnet. Auf diese Weise werden Datensätze im Kontext eines gruppierten Index eindeutig gemacht. Alle nicht gruppierten Indizes enthalten standardmäßig den gruppierten Schlüssel, um bei Bedarf Lookups durchzuführen. Alle Indizes werden für jede entsprechende DML-Anweisung eingefügt, aktualisiert oder gelöscht. Trotzdem ist es am besten, Leistungsgewinne in select-Anweisungen gegen Leistungstreffer in insert-, delete- und update-Anweisungen abzuwägen.

    Um abzuschrecken

    11 January 2011
    Claude Houle
  • Ich habe kürzlich ein fantastisches kostenloses Skript von den Leuten von BrentOzar Unltd entdeckt. http: //www.brentozar. com / blitzindex /

    Hier wird eine gute Analyse durchgeführt, welche Indizes vorhanden sind, wie oft sie verwendet werden und wie oft das Abfragemodul nach einem Index sucht, der dies nicht tut. t exist.

    Die Anleitung ist im Allgemeinen gut. Manchmal wird es ein wenig übertrieben auf Ideen. Ich habe im Allgemeinen Folgendes bisher getan:

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

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

    Im Allgemeinen sollten Sie Indizes vermeiden on:

    • Sehr kleine Tabellen (weniger als 50 bis 200 Datensätze): Die Abfrage-Engine ist oft schneller, wenn sie die Tabelle durchsucht und nicht den Index lädt , lesen, bearbeiten usw.
    • Vermeiden Sie Indizes für Spalten mit niedriger Kardinalität ( http: //en.wikipedia.org/wiki/Cardinality_(SQL_Anweisungen) ) in der ersten Spalte. Z.B. Die Indizierung eines Gender-Feldes (M / F) ist von sehr geringem Nutzen. Es ist ebenso praktisch, die Tabelle zu scannen und die ~ 50% zu finden, die übereinstimmen. Wenn der Index nach etwas spezifischer im Index aufgeführt ist (z. B. [Geburtsdatum, Geschlecht]), ist es besser, wenn Sie möchten, dass alle in einem bestimmten Zeitraum geborenen Männer geboren werden.

    Clustered-Indizes sind gut - normalerweise basieren sie auf Ihrem Primärschlüssel. Sie helfen der Datenbank-Engine, die Daten auf der Festplatte in Ordnung zu bringen. Dies ist sehr wichtig, um dies für die größten Tabellen zu verstehen, da ein guter Clustered-Index häufig den Platzbedarf der Tabelle reduziert.

    Ich habe einige Tabellen von 900 MB auf 400 MB reduziert

    10 May 2013
    Greg Robson
  • Normalerweise haben Sie eine bestimmte Arbeitslast (Abfragen) und prüfen sorgfältig die Auswirkungen jedes neuen Index auf die Arbeitslast. Dieser iterative Prozess sollte immer eine sorgfältige Analyse der Ausführungspläne beinhalten, aus der hervorgeht, welche Indizes verwendet werden. Das Thema zum Analysieren einer Abfrage ist langwierig und beginnt mit dem dedizierten MSDN-Kapitel Analysieren einer Abfrage ist eine gute Wette.

    Manchmal, wenn die Arbeitslast zu komplex ist oder das Wissen über das Datenbankdesign unklar ist, wird Database Engine Tuning Advisor , der eine automatische Analyse der Arbeitslast vornimmt 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 wirklich nur ein Fall von A / B-Tests : Sie führen Ihre Workload ohne Index als Basislinie aus, führen dann den Index mit dem Index aus, messen und vergleichen mit der Basislinie und entscheiden dann basierend auf Beobachtungen und gemessene Metriken, wenn die Auswirkung von Vorteil ist. Die Workload ist am besten eine qualitativ hochwertige Testsuite, es kann jedoch auch eine Wiederholung einer erfassten Workloads sein : Wiedergeben einer Trace-Datei .

    Eine eher synthetische Antwort ist der sys.dm_db_index_usage_stats sehen und sehen, wie Indizes verwendet werden, aber dies ist in der Regel ein Ansatz für die Vor-Ort-Analyse bei einer unbekannten Arbeitslast (dh, ein Berater würde helfen) fange wahrscheinlich damit an).

    16 November 2011
    Remus Rusanu
  • Ab SQL 2005 hat SQL Server DMV sagen Sie, was die Datenbank-Engine für Indizes verwenden würde, wenn sie verfügbar wären. Die Ansichten können Ihnen sagen, 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 Anzahl der Suchvorgänge zu sortieren und in Betracht zu ziehen, zuerst die oberen Indizes hinzuzufügen.

    04 January 2011
    Justin Standard
  • Das hängt davon ab, wie diese Tabelle verwendet wird. z.B. Nehmen wir an, ich habe eine Tabelle, die oft gelesen wird, aber Aktualisierungen und Einfügungen sind selten. Außerdem frage ich die Tabelle immer nach einer Fremdschlüsselspalte ab. Es ist sinnvoll, einen (nicht gruppierten) Index für diesen Fremdschlüssel zu erstellen, um Leseanfragen zu beschleunigen. Der Nachteil ist jedoch, dass die Aktualisierung Ihrer Einfügung langsam wird.

    Es gibt wenige Statistikabfragen, die Aufschluss darüber geben, wie viel Zeit für Abfragen benötigt wird. Beginnen Sie mit den langsamsten. Wenn das Abfrage-Prädikat keinen Index hat, hilft das Erstellen eines Abfrageprädikats.

    16 November 2011
    Ankush