Ich habe gehört, dass Sie zu Beginn der Indexdeklaration Spalten einfügen sollten, die am selektivsten sind. Beispiel:
CREATE NONCLUSTERED INDEX MyINDX on Table1
(
MostSelective,
SecondMost,
Least
)
Ist das, was ich sage, richtig? Wenn ja, sehe ich wahrscheinlich große Leistungsunterschiede, wenn ich die Reihenfolge der Spalten in meinem Index neu ordne, oder ist es eher eine "nette Aufgabe"?
Der Grund, den ich frage, ist, dass nach dem Durchführen einer Abfrage durch den DTA empfohlen wurde, einen Index zu erstellen, der fast alle gleichen Spalten wie ein vorhandener Index enthält, nur in einer anderen Reihenfolge. Ich dachte darüber nach, nur die fehlenden Spalten zum vorhandenen Index hinzuzufügen und ihn als gut zu bezeichnen. Gedanken?
quelle
Die Reihenfolge der Spalten ist kritisch. Welche Reihenfolge nun korrekt ist, hängt davon ab, wie Sie sie abfragen. Ein Index kann verwendet werden, um eine genaue Suche oder einen Bereichsscan durchzuführen. Eine genaue Suche ist, wenn Werte für alle Spalten im Index angegeben werden und die Abfrage genau in der Zeile landet, an der sie interessiert ist. Für Suchen ist die Reihenfolge der Spalten irrelevant. Bei einem Bereichsscan werden nur einige Spalten angegeben, und in diesem Fall wird die Reihenfolge wichtig. SQL Server kann einen Index für einen Bereichsscan nur verwenden, wenn die Spalte ganz links angegeben ist, und nur dann, wenn die nächste Spalte ganz links angegeben ist, und so weiter. Wenn Sie einen Index für (A, B, C) haben, können Sie damit den Bereichssuchlauf für
A=@a
,A=@a AND B=@b
aber nicht fürB=@b
, fürC=@c
noch durchführenB=@b AND C=@c
. Der FallA=@a AND C=@c
ist gemischt, wie in derA=@a
Teil verwendet den Index, aberC=@c
nicht (die Abfrage durchsucht alle B-Werte nachA=@a
, springt nicht zuC=@c
). Andere Datenbanksysteme verfügen über den sogenannten "Skip Scan" -Operator, der die inneren Spalten in einem Index nutzen kann, wenn die äußeren Spalten nicht angegeben sind.Mit diesem Wissen können Sie sich die Indexdefinitionen noch einmal ansehen. Ein Index für
(MostSelective, SecondMost, Least)
ist nur wirksam, wenn eineMostSelective
Spalte angegeben ist. Da dies jedoch am selektivsten ist, wird sich die Relevanz der inneren Säulen schnell verschlechtern. Sehr oft werden Sie feststellen , dass ein besserer Index auf(MostSelective) include (SecondMost, Least)
oder auf(MostSelective, SecondMost) include (Least)
. Da die inneren Spalten weniger relevant sind, führt das Platzieren von Spalten mit geringer Selektivität an solchen richtigen Positionen im Index zu nichts als Rauschen für eine Suche. Daher ist es sinnvoll, sie aus den Zwischenseiten zu verschieben und sie nur auf den Blattseiten zu belassen, z Abdeckbarkeit der Abfrage. Mit anderen Worten, verschieben Sie sie in INCLUDE. Dies wird mit der Größe von wichtigerLeast
Spaltengröße . Die Idee ist, dass dieser Index nur Abfragen zugute kommen kann, die angebenMostSelective
entweder als exakter Wert oder als Bereich, und diese Spalte ist die selektivste, die die Kandidatenzeilen bereits stark einschränkt.Auf der anderen Seite
(Least, SecondMost, MostSelective)
mag ein Index auf ein Fehler sein, aber es ist tatsächlich ein ziemlich mächtiger Index. Da dieLeast
Spalte die äußerste Abfrage ist, kann sie für Abfragen verwendet werden, bei denen Ergebnisse in Spalten mit geringer Selektivität zusammengefasst werden müssen. Solche Abfragen sind in OLAP- und Analyse-Data-Warehouses weit verbreitet, und genau hier haben solche Indizes einen sehr guten Grund. Solche Indizes sind tatsächlich hervorragende Clustered- Indizes, gerade weil sie das physische Layout in großen Abschnitten verwandter Zeilen organisieren (gleicherLeast
Wert, der normalerweise eine Kategorie oder einen Typ angibt) und Analyseabfragen erleichtern.Es gibt also leider keine "richtige" Reihenfolge. Sie sollten kein Rezept für einen Ausstecher befolgen, sondern das Abfragemuster, das Sie verwenden möchten, anhand dieser Tabellen analysieren und entscheiden, welche Indexspaltenreihenfolge richtig ist.
quelle
Wie Remus sagt, hängt es von Ihrer Arbeitsbelastung ab.
Ich möchte jedoch einen irreführenden Aspekt der akzeptierten Antwort ansprechen.
Bei Abfragen, die eine Gleichheitssuche für alle Spalten im Index durchführen, gibt es keinen signifikanten Unterschied.
Im Folgenden werden zwei Tabellen erstellt und mit identischen Daten gefüllt. Der einzige Unterschied besteht darin, dass bei einem die Schlüssel von am meisten bis am wenigsten selektiv und bei dem anderen umgekehrt angeordnet sind.
Führen Sie jetzt eine Abfrage für beide Tabellen durch ...
... Beide verwenden eine Indexstrafe und beide erhalten genau die gleichen Kosten.
Die ASCII-Kunst in der akzeptierten Antwort ist nicht die Struktur der Indizes. Die Indexseiten für Tabelle 1 sind unten dargestellt (klicken Sie auf das Bild, um es in voller Größe zu öffnen).
Die Indexseiten enthalten Zeilen, die den gesamten Schlüssel enthalten (in diesem Fall wird tatsächlich eine zusätzliche Schlüsselspalte für die Zeilenkennung angehängt, da der Index nicht als eindeutig deklariert wurde, aber dies kann ignoriert werden. Weitere Informationen hierzu finden Sie hier ).
Bei der obigen Abfrage kümmert sich SQL Server nicht um die Selektivität der Spalten. Es führt eine binäre Suche auf der Stammseite durch und stellt fest, dass der Schlüssel vorhanden
(PPP...,3,~ )
ist,>=(JJJ...,1,~ )
und< (SSS...,3,~ )
sollte daher die Seite lesen1:118
. Anschließend werden die Schlüsseleinträge auf dieser Seite binär durchsucht und die Blattseite gefunden, zu der nach unten gewechselt werden soll.Das Ändern des Index in der Reihenfolge der Selektivität wirkt sich weder auf die erwartete Anzahl der Schlüsselvergleiche aus der binären Suche noch auf die Anzahl der Seiten aus, die für eine Indexsuche navigiert werden müssen. Bestenfalls könnte dies den Schlüsselvergleich selbst geringfügig beschleunigen.
Manchmal ist es jedoch sinnvoll, zuerst den selektivsten Index zu bestellen, um andere Abfragen in Ihrer Workload durchzuführen.
Beispiel: Wenn die Arbeitslast Abfragen der beiden folgenden Formulare enthält.
Die obigen Indizes decken keinen von beiden ab.
MostSelective
ist selektiv genug, um einen Plan mit einer Suche und Suche zu erstellen, die sich lohnt, aber die Abfrage dagegenLeast
ist es nicht.Dieses Szenario (nicht abdeckende Indexsuche für Teilmenge führender Spalten eines zusammengesetzten Index) ist jedoch nur eine mögliche Abfrageklasse, die von einem Index unterstützt werden kann. Wenn Sie niemals
MostSelective
alleine oder in einer Kombination vonMostSelective, SecondMost
und immer nach einer Kombination aller drei Spalten suchen, ist dieser theoretische Vorteil für Sie nutzlos.Umgekehrt Abfragen wie
Wäre hilfreich, wenn die umgekehrte Reihenfolge der üblicherweise vorgeschriebenen verwendet würde - da diese die Abfrage abdeckt, kann sie eine Suche unterstützen und Zeilen in der gewünschten Reihenfolge zum Booten zurückgeben.
Dies ist also ein oft wiederholter Ratschlag, aber höchstens eine Heuristik über den potenziellen Nutzen anderer Abfragen - und es ist kein Ersatz dafür, Ihre Arbeitsbelastung tatsächlich zu betrachten .
quelle
Richtig. Indizes können zusammengesetzte Elemente sein, die aus mehreren Spalten bestehen. Die Reihenfolge ist aufgrund des Prinzips ganz links wichtig. Grund dafür ist, dass die Datenbank die Liste von links nach rechts überprüft und eine entsprechende Spaltenreferenz finden muss, die der definierten Reihenfolge entspricht. Beispiel: Ein Index für eine Adresstabelle mit Spalten:
Jede Abfrage, die die
address
Spalte verwendet, kann den Index verwenden. Wenn die Abfrage jedoch nur entwedercity
und / oderstate
Referenzen enthält, kann der Index nicht verwendet werden. Dies liegt daran, dass auf die Spalte ganz links nicht verwiesen wird. Die Abfrageleistung sollte Ihnen sagen, welche optimal ist - einzelne Indizes oder mehrere Verbundwerkstoffe mit unterschiedlicher Reihenfolge. Gut gelesen: The Tipping Point von Kimberley Trippquelle
Alle anderen Antworten sind falsch.
Die Selektivität der einzelnen Spalten in einem zusammengesetzten Index spielt bei der Auswahl der Bestellung keine Rolle.
Hier ist der einfache Denkprozess: Ein Index ist effektiv die Verkettung der beteiligten Spalten.
Ausgehend von dieser Begründung besteht der einzige Unterschied darin, zwei "Zeichenfolgen" zu vergleichen, die sich früher und später in der Zeichenfolge unterscheiden. Dies ist ein winziger Teil der Gesamtkosten. Es gibt keinen "ersten Durchgang / zweiten Durchgang", wie in einer Antwort erwähnt.
Also, welche Reihenfolge sollte verwendet werden?
=
in beliebiger Reihenfolge.Zum Beispiel ist die sehr geringe Selektivität Säule muss zuerst kommt in diesen:
Wenn Sie die Reihenfolge im Index austauschen, wird dies völlig ignoriert
deleted
.(Es gibt viel mehr Regeln für die Reihenfolge der Spalten.)
quelle
deleted
hilft nicht viel beim Herausfiltern unerwünschter Zeilen. Hast du ein besseres Beispiel? (Das ist derjenige, der mir in den Sinn kam, als ich die Antwort schrieb.)