853 Stimmen

Mehrere Indizes vs. mehrspaltige Indizes

Was ist der Unterschied zwischen der Erstellung eines Indexes für mehrere Spalten und der Erstellung mehrerer Indizes, von denen einer per Spalte?

Gibt es Gründe, die für die Verwendung des einen statt des anderen sprechen?

Zum Beispiel:

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

Versus:

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)

420voto

evilhomer Punkte 8236

Ich stimme zu mit Cade Roux .

Dieser Artikel soll Sie auf den richtigen Weg bringen:

Eine Sache zu beachten, geclusterte Indizes sollten einen eindeutigen Schlüssel (eine Identitätsspalte würde ich empfehlen) als die erste Spalte haben. Grundsätzlich hilft dies, dass Ihre Daten am Ende des Indexes eingefügt werden und nicht zu viel Festplatten-IO und Page Splits führen.

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

Stellen Sie sich z.B. vor, Sie suchen in einer Tabelle nach drei Spalten

Bundesland, Landkreis, Postleitzahl.

  • Sie suchen manchmal nur nach Bundesland.
  • können Sie manchmal nach Bundesland und Bezirk suchen.
  • Sie können häufig nach Bundesland, Landkreis und Postleitzahl suchen.

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

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

Sie könnten dann einen Index nur für Zip erstellen, der in diesem Fall verwendet wird.

Übrigens Wir können uns die Tatsache zunutze machen, dass bei der mehrspaltigen Indexierung die erste Indexspalte immer für die Suche verwendet werden kann und wenn Sie nur nach "state" suchen, ist es effizient, aber nicht so effizient wie ein einspaltiger Index auf "state".

Ich schätze, die Antwort, die Sie suchen, ist, dass es von den Where-Klauseln Ihrer häufig verwendeten Abfragen und auch von Ihren Group-by's abhängt.

Der Artikel wird mir sehr helfen :-)

92voto

Cade Roux Punkte 85601

Ja. Ich empfehle Ihnen, sich über Kimberly Tripp's Artikel über Indizierung .

Wenn ein Index "abdeckend" ist, ist es nicht notwendig, etwas anderes als den Index zu verwenden. In SQL Server 2005 können Sie dem Index auch zusätzliche Spalten hinzufügen, die nicht Teil des Schlüssels sind, wodurch sich die Suche nach dem Rest der Zeile erübrigen kann.

Mehrere Indizes für jeweils eine Spalte können bedeuten, dass nur ein Index überhaupt verwendet wird - Sie müssen den Ausführungsplan heranziehen, um zu sehen, welche Auswirkungen verschiedene Indizierungsschemata haben.

Sie können auch den Abstimmungsassistenten verwenden, um zu ermitteln, welche Indizes für eine bestimmte Abfrage oder Arbeitslast die beste Leistung erbringen würden.

62voto

MobyDX Punkte 1380

Der mehrspaltige Index kann für Abfragen verwendet werden, die sich auf 何れも die Spalten:

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

Diese kann direkt über den mehrspaltigen Index abgefragt werden. Andererseits kann höchstens einer der einspaltigen Indizes verwendet werden (er müsste alle Datensätze mit Spalte1=1 nachschlagen und dann Spalte2 und Spalte3 in jedem dieser Datensätze überprüfen).

19voto

Ein Punkt, der anscheinend übersehen wurde, ist die Sternentransformation. Index Schnittpunkt Operatoren lösen das Prädikat auf, indem sie die Menge der Zeilen berechnen, die von jedem der Prädikate getroffen werden, bevor eine E/A in der Faktentabelle durchgeführt wird. In einem Sternschema würden Sie jeden einzelnen Dimensionsschlüssel indizieren, und der Abfrageoptimierer kann die auszuwählenden Zeilen durch die Berechnung der Indexüberschneidung auflösen. Die Indizes für einzelne Spalten bieten hierfür die größte Flexibilität.

16voto

Bob Probst Punkte 9235

Wenn Sie Abfragen haben, die häufig einen relativ statischen Satz von Spalten verwenden, kann die Erstellung eines einzigen abdeckenden Index, der alle Spalten umfasst, die Leistung erheblich verbessern.

Wenn Sie mehrere Spalten in Ihren Index aufnehmen, muss der Optimierer nur dann direkt auf die Tabelle zugreifen, wenn eine Spalte nicht im Index enthalten ist. Ich verwende dies häufig im Data Warehousing. Der Nachteil ist, dass dies eine Menge Overhead kosten kann, insbesondere wenn die Daten sehr flüchtig sind.

Die Erstellung von Indizes für einzelne Spalten ist für Nachschlageoperationen nützlich, die häufig in OLTP-Systemen vorkommen.

Sie sollten sich fragen, warum Sie die Spalten indizieren und wie sie verwendet werden. Führen Sie einige Abfragepläne aus und sehen Sie, wann auf sie zugegriffen wird. Die Indexabstimmung ist ebenso sehr Instinkt wie Wissenschaft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X