Mehrere Indizes im Vergleich zu mehrspaltigen Indizes

644

Ich habe gerade einen Index zu einer Tabelle in SQL Server 2005 hinzugefügt und es hat mich zum Nachdenken gebracht. Was ist der Unterschied zwischen dem Erstellen eines Index und dem Definieren mehrerer Spalten gegenüber einem Index pro Spalte, die Sie indizieren möchten?

Gibt es bestimmte Gründe, warum einer über den anderen verwendet werden sollte?

Zum Beispiel

Create NonClustered Index IX_IndexName On TableName
(Column1 Asc, Column2 Asc, Column3 Asc)

Gegen

Create NonClustered Index IX_IndexName1 On TableName
(Column1 Asc)

Create NonClustered Index IX_IndexName2 On TableName
(Column2 Asc)

Create NonClustered Index IX_IndexName3 On TableName
(Column3 Asc)
GateKiller
quelle

Antworten:

319

Ich stimme Cade Roux zu .

Dieser Artikel soll Sie auf den richtigen Weg bringen:

Zu beachten ist, dass Clustered-Indizes einen eindeutigen Schlüssel (eine Identitätsspalte, die ich empfehlen würde) als erste Spalte haben sollten. Grundsätzlich hilft es Ihnen, Ihre Daten am Ende des Index einzufügen und nicht viele Festplatten-E / A- und Seitensplits zu verursachen.

Zweitens, wenn Sie andere Indizes für Ihre Daten erstellen und diese geschickt erstellt werden, werden sie wiederverwendet.

Stellen Sie sich beispielsweise vor, Sie durchsuchen eine Tabelle in drei Spalten

Bundesland, Landkreis, Postleitzahl.

  • Sie suchen manchmal nur nach Bundesland.
  • Sie suchen manchmal nach Bundesstaat und Landkreis.
  • Sie suchen häufig nach Bundesstaat, Landkreis, Postleitzahl.

Dann ein Index mit Bundesland, Landkreis, Postleitzahl. wird in allen drei Suchvorgängen verwendet.

Wenn Sie häufig nur nach zip suchen, wird der obige Index nicht verwendet (ohnehin von SQL Server), da zip der dritte Teil dieses Index ist und der Abfrageoptimierer diesen Index nicht als hilfreich ansieht.

Sie können dann einen Index nur für Zip erstellen, der in dieser Instanz verwendet wird.

Übrigens können wir die Tatsache nutzen, dass bei der mehrspaltigen Indizierung die erste Indexspalte immer für die Suche verwendet werden kann. Wenn Sie nur nach "Status" suchen, ist sie effizient, aber nicht so effizient wie der Status "Einspaltiger Index ein" '

Ich denke, die Antwort, nach der Sie suchen, ist, dass es von Ihren where-Klauseln Ihrer häufig verwendeten Abfragen und auch von Ihren Gruppen nach abhängt.

Der Artikel wird viel helfen. :-)

Evilhomer
quelle
2
Wäre es also am besten, zusätzlich zu einem individuellen Index für jede Spalte einen Index für Bundesstaat, Landkreis und Postleitzahl zu definieren?
Maxim Zaslavsky
12
@jball Vermisse ich hier etwas? Anscheinend handelt der Artikel hauptsächlich von den Unterschieden zwischen den Versionsbeschränkungen von SQL Server. Könnte der Artikel verschoben worden sein?
Ian R. O'Brien
@ Ian, es sieht so aus, als wäre in den nächsten 3 Jahren etwas verloren gegangen, seit ich vor über 4 Jahren den ursprünglichen Link aussortiert habe. Ich kann Ihnen sagen, dass der Blog-Beitrag den richtigen Titel hat, mit dem von evilhomer verlinkt wurde, aber es sieht so aus, als ob die nachfolgenden Blogs in der Serie von diesem ersten Beitrag nicht mehr leicht zu finden sind. Sie müssen in Kimberlys Blog-Archiv nachsehen, ob Sie die anderen in der Serie auftauchen können.
Jball
1
1) "Grundsätzlich hilft [Clustered Index mit IDENTITY-Spalte als erstes] beim Einfügen Ihrer Daten am Ende des Index" ist korrekt. "und nicht viele Festplatten-E / A- und Seitensplits verursachen" ist in einem Mehrbenutzersystem völlig falsch. Die Wahrheit ist, es garantiert hohe Konflikte (geringe Parallelität) in einem Mehrbenutzersystem. 2) Der Clustered-Index sollte ein relationaler Schlüssel sein, d. H. nicht ein IDENTITY, GUID, etc. 3) "Dann wird bei allen drei Suchvorgängen ein Index mit Bundesstaat, Landkreis und Postleitzahl verwendet." ist falsch und widerspricht "die erste Spalte ist verwendbar". Die 2. & Subs-Spalten im Index können nicht für die Suche verwendet werden.
PerformanceDBA
82

Ja. Ich empfehle Ihnen, die Artikel von Kimberly Tripp zur Indexierung zu lesen .

Wenn ein Index "abdeckt", muss nur der Index verwendet werden. In SQL Server 2005 können Sie dem Index auch zusätzliche Spalten hinzufügen, die nicht Teil des Schlüssels sind, wodurch Auslösungen in den Rest der Zeile vermieden werden.

Wenn mehrere Indizes in einer einzelnen Spalte vorhanden sind, wird möglicherweise nur ein Index verwendet. Sie müssen sich auf den Ausführungsplan beziehen, um zu sehen, welche Auswirkungen verschiedene Indexierungsschemata bieten.

Sie können auch den Optimierungsassistenten verwenden, um festzustellen, welche Indizes eine bestimmte Abfrage oder Arbeitslast am besten ausführen lassen.

Cade Roux
quelle
7
Kimberly Tripp weiß, wovon sie spricht. Ich war bei einem Gespräch mit ihr und sie kennt dieses Zeug in- und auswendig. Guter Hinweis.
Evilhomer
@CadeRoux Wenn meine where-Klausel meistens zwei Spalten in der Beziehung '&' enthält, ist es besser, einen mehrspaltigen Index oder einen einspaltigen Index für beide zu haben
es ist eine Falle
2
@RachitGupta Ein Index mit beiden Spalten
Cade Roux
41

Der mehrspaltige Index kann für Abfragen verwendet werden, die auf alle Spalten verweisen :

SELECT *
FROM TableName
WHERE Column1=1 AND Column2=2 AND Column3=3

Dies kann direkt über den mehrspaltigen Index nachgeschlagen werden. Auf der anderen Seite kann höchstens einer der einspaltigen Indizes verwendet werden (er müsste alle Datensätze mit Spalte1 = 1 nachschlagen und dann jeweils Spalte2 und Spalte3 überprüfen).

MobyDX
quelle
24
Das ist richtig. Wenn Sie diese Spalten jedoch jeweils als einen Index haben, wird dies die Dinge immer noch dramatisch beschleunigen. Normalerweise reduziert einer der Werte in den Spalten die resultierende Menge so stark, dass es nicht wichtig ist, den Rest ohne Index nachzuschlagen, und der Optimierer kann diesen Wert gut auswählen.
TToni
17

Ein Punkt, der vermisst worden zu sein scheint, sind Sternumwandlungen. Index-Schnittoperatoren lösen das Prädikat auf, indem sie den Satz von Zeilen berechnen, die von jedem der Prädikate getroffen werden, bevor E / A in der Faktentabelle ausgeführt werden. In einem Sternschema würden Sie jeden einzelnen Dimensionsschlüssel indizieren, und der Abfrageoptimierer kann auflösen, welche Zeilen durch die Indexschnittpunktberechnung ausgewählt werden sollen. Die Indizes für einzelne Spalten bieten hierfür die beste Flexibilität.

ConcernedOfTunbridgeWells
quelle
+1 für die verknüpfte gute Erklärung, wie (gewöhnliche) Indizes verwendet werden, relevant für die Frage.
RobM
8

Wenn Sie Abfragen haben, bei denen häufig relativ statische Spalten verwendet werden, wird die Leistung erheblich verbessert, wenn Sie einen einzelnen Deckungsindex erstellen, der alle Spalten enthält.

Durch das Einfügen mehrerer Spalten in Ihren Index muss der Optimierer nur dann direkt auf die Tabelle zugreifen, wenn sich eine Spalte nicht im Index befindet. Ich benutze diese häufig im Data Warehousing. Der Nachteil ist, dass dies viel Aufwand kosten kann, insbesondere wenn die Daten sehr volatil sind.

Das Erstellen von Indizes für einzelne Spalten ist nützlich für Suchvorgänge, die häufig in OLTP-Systemen ausgeführt werden.

Sie sollten sich fragen, warum Sie die Spalten indizieren und wie sie verwendet werden. Führen Sie einige Abfragepläne aus und prüfen Sie, wann auf sie zugegriffen wird. Index-Tuning ist genauso instinktiv wie Wissenschaft.

Bob Probst
quelle