Gruppierte SQL Server-Index - Reihenfolge der Index-Frage
Ich habe eine Tabelle etwa so:
keyA keyB data
keyA und keyB zusammen eindeutig sind, sind der primary key meiner Tabelle und machen einen gruppierten index.
Gibt es 5 mögliche Werte keyB, aber eine unbegrenzte Anzahl von möglichen Werten von keyA,. keyB allgemein-Schritten.
Beispielsweise die folgenden Daten können bestellt werden in 2 Arten, je nachdem, welche Schlüssel-Spalte ist bestellt erste:
keyA keyB data
A 1 X
B 1 X
A 3 X
B 3 X
A 5 X
B 5 X
A 7 X
B 7 X
oder
keyA keyB data
A 1 X
A 3 X
A 5 X
A 7 X
B 1 X
B 3 X
B 5 X
B 7 X
Muss ich Ihnen sagen, die dem gruppierten index, der die wichtigsten Spalten hat weniger mögliche Werte zulassen, um die Daten nach diesem Wert zuerst? Oder spielt es keine Rolle, in Bezug auf die Leistung, die bestellt zuerst?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie um Ihrer zusammengesetzten gruppierten index mit der höchsten Selektivität ersten Spalte. Dies bedeutet, dass die Spalte mit den meisten unterschiedlichen Werte im Vergleich zum Gesamt-Zeilenanzahl.
"B*TREE Indizes verbessern die Leistung von Abfragen, wählen Sie einen kleinen Prozentsatz von Zeilen aus einer Tabelle." http://www.akadia.com/services/ora_index_selectivity.html?
Dieser Artikel ist für Oracle, aber immer noch relevant.
Auch, wenn Sie eine Anfrage haben, die läuft immer mit und gibt einige Felder, die Sie möglicherweise erstellen Sie einen zusammengesetzten index, der alle Felder enthält, wird es nicht haben Zugriff auf die Basis-Tabelle, sondern stattdessen ziehen die Daten aus dem index.
ligget78 Kommentar unbedingt erwähnen, in der ersten Spalte eines zusammengesetzten index ist wichtig, daran zu erinnern.
Wenn Sie einen index erstellen (unabhängig gruppierten oder nicht) mit (keyA, keyB), dann ist dies, wie die Werte bestellt werden, z.B. erste keyA, dann keyB (dies ist der zweite Fall in deiner Frage). Wenn Sie wollen, dass es die andere Weise herum, die Sie angeben müssen (keyB, keyA).
Könnte es egal performance-Weise, hängt von deiner Abfrage natürlich. Zum Beispiel, wenn Sie haben (keyA, keyB) index und die Abfrage aussieht, WO keyB = ... (ohne zu erwähnen, keyA), dann kann der index nicht genutzt werden.
Wie schon andere gesagt haben, die Bestellung ist basiert auf, wie Sie geben Sie es in die index-Erstellung Skript (oder PK-Einschränkung). Eine Sache zu clustered-Indizes ist allerdings, dass es viel gibt, zum im Verstand zu halten.
Erhalten Sie möglicherweise die bessere Gesamt-performance, indem Sie mit Ihren clustered-index auf etwas anderes als die PK. Zum Beispiel, wenn Sie schreiben einen finanziellen system und die Berichte sind fast immer basierend auf dem Datum und Uhrzeit der Aktivität alle Aktivitäten für das vergangene Jahr, etc.) dann einen gruppierten index für diese Spalte Datum könnte besser sein. Als HLGEM sagt, die Sortierung kann auch beeinflusst werden durch Ihre Auswahl des gruppierten index.
Gruppierten Indizes kann auch Auswirkungen auf die Einsätze mehr als andere Indizes. Wenn Sie eine große Anzahl von inserts und Ihren clustered-index auf so etwas wie eine IDENTITY-Spalte dann könnte es Streit, Probleme, die für diesen bestimmten Teil der Festplatte, da alle neuen Zeilen eingefügt werden, die in der gleichen Stelle.
Für kleine look-up-Tabellen, die ich immer nur legen Sie den gruppierten index für den PK. Für high-impact-Tabellen, obwohl es eine gute Idee, um die Zeit zu verbringen darüber nachzudenken (und testen) der verschiedenen möglichen gruppierten Indizes, bevor die Auswahl der besten eins.
Ich glaube, dass SQL-Server orders es genau so, wie Sie es sagen. Es wird davon ausgegangen, dass Sie am besten wissen, wie Sie Zugang zu Ihrem index.
In jedem Fall, ich würde sagen, es ist eine gute Idee, wo möglich, zu spezifizieren, was Sie genau möchten, anstatt der Hoffnung der Datenbank wird es herausfinden.
Können Sie auch versuchen, es in beide Richtungen, führen Sie eine Reihe von repräsentativen Abfragen und dann vergleichen Sie die generierten Ausführungspläne, um zu bestimmen, welche ist am besten für Sie.
Denken Sie daran, dass die gruppierten index ist die physikalische Reihenfolge, in der die Tabelle auf der Festplatte gespeichert ist.
So, wenn Sie Ihren clustered-index ist definiert als ColA, ColB Abfragen werden schneller ausgeführt, wenn die Bestellung in der gleichen Reihenfolge, wie Sie Ihren clustered-index. Wenn SQL hat, um zu B,A wird es erfordern, post Ausführung Sortierung zum erreichen der richtigen Reihenfolge.
Mein Vorschlag ist, fügen Sie eine zweite nicht-gruppierten index auf B,A. Auch abhängig von der Größe der Daten der Spalte zu ZÄHLEN(Lesen enthalten, Spalte) es zu verhindern, dass die Notwendigkeit für den Schlüssel suchen. Das ist, natürlich, vorausgesetzt, dass diese Tabelle nicht so stark eingesetzt, wie Sie immer die balance zwischen abfragegeschwindigkeit gegenüber der Schreibgeschwindigkeit.
Realistisch, Ihre clustered index sollte die Reihenfolge darstellen, in denen die Daten am wahrscheinlichsten zugegriffen werden sowie die Aufrechterhaltung einer feinen balance von insert\update IO-Kosten. Wenn Ihr gruppierten index, so dass Sie ständig einsetzen in der Mitte der Seiten, die Sie leiden können performance-Verluste gibt.
Wie andere gesagt haben, ohne zu wissen, die Tabelle Länge, Spalte Größen, etc. es gibt keine richtige Antwort. Versuch und Irrtum mit einer starken Dosis des Tests ist Ihre beste Wette.
Nur im Fall, dass dies nicht offensichtlich ist: die Sortierreihenfolge Ihrer index verspricht nicht zu viel über die die Sortierreihenfolge der Ergebnisse in einer Abfrage.
In Ihren Abfragen, müssen Sie noch hinzufügen eines
oder
Kann der Optimierer werden erfreut, um zu finden die Daten bereits physikalisch Bestellung in den index, wie gewünscht, und speichern Sie einige Zeit, aber jede Abfrage soll die Daten liefern, die in einer bestimmten Reihenfolge, müssen Sie eine ORDER BY-Klausel am Ende. Ohne order by, SQL-Server macht keine Versprechungen in Bezug auf die Reihenfolge von ein recordset, oder auch, dass es wieder kommen wird, in der gleichen Reihenfolge von Abfrage zu Abfrage.
Die beste Sache, die Sie tun können, ist zu versuchen, beide Lösungen und Messen die Ausführungszeit.
Meiner Erfahrung, index tuning ist alles andere als eine exakte Wissenschaft.
Vielleicht keyB, bevor keyA in der index-Spalte, um besser wäre,
Geben Sie die Spalten in der Reihenfolge, in der Sie normalerweise wollen, dass Sie sortiert, die in berichten und Abfragen.
Ich würde vorsichtig sein, die Schaffung eines mehrspaltigen gruppierten index wenn. Je nachdem, wie weit das ist, Sie haben könnte einen großen Einfluss auf die Größe der anderen Indizes, die Sie erstellen, da alle non-clustered-Indizes enthalten, die dem gruppierten index, Wert in Ihnen. Auch die Zeilen neu sortiert, wenn die Werte Häufig ändern und es ist meine Erfahrung, dass nicht-surrogate keys neigen dazu, sich häufiger ändern. Daher erstellen diese wie ein clustered-Vize nicht gruppierten index könnte viel mehr zeitaufwendig von server-Ressourcen, wenn Sie die Werte haben, die sich wahrscheinlich ändern. Ich sage nicht, Sie sollten dies nicht tun, da ich nicht weiß, welche Art von Daten die Spalten enthalten (obwohl ich vermute, Sie sind komplexer, dass A1, a2, etc); ich sage, Sie müssen denken, über die Konsequenzen zu machen. Es wäre wahrscheinlich eine gute Idee, um gründlich zu Lesen BOL zu clustered-Vize nicht gruppierten Indizes, bevor dies zu tun.
Solltest du ja vorschlagen, normalerweise Abfrage-engine versuchen, um herauszufinden, die best-execution-plan und den index nutzen, aber irgendwann ist es besser, Kraft-Abfrage-engine zu verwenden, die bestimmten index. Es gibt einige andere berücksichtigen bei der Planung für das index-als auch bei der Nutzung der index in die Abfrage. zum Beispiel werden in der Spalte bestellen in den index der Spalte Sortierung in der where-Klausel. Sie könnte zu verweisen, folgenden link zu kennen:
http://ashishkhandelwal.arkutil.com/sql-server/quick-and-short-database-indexes/
Ich bin sicher, dass dies helfen Ihnen auch bei der Planung für den index.