it-swarm.com.de

Mehrere Indizes im Vergleich zu mehrspaltigen Indizes

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 über einen Index pro Spalte, den Sie indizieren möchten?.

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

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)
587
GateKiller

Ich stimme zu Cade Roux .

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 Datenträger IO und Seitensplits zu verursachen.

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

z.B. Stellen Sie sich vor, Sie durchsuchen eine Tabelle in drei Spalten

bundesland, Landkreis, Postleitzahl.

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

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

Wenn Sie häufig allein nach Zip suchen, wird der oben genannte Index nicht verwendet (von SQL Server ohnehin nicht), 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.

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

Der Artikel wird viel helfen. :-)

288
evilhomer

Ja. Ich empfehle Ihnen, sich Kimberly Tripps Artikel zur Indizierung anzusehen.

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 für den Rest der Zeile vermieden werden.

Wenn Sie mehrere Indizes für jeweils eine Spalte haben, wird möglicherweise nur ein Index verwendet. Sie müssen sich auf den Ausführungsplan beziehen, um zu sehen, welche Auswirkungen die verschiedenen Indizierungsschemata haben.

Sie können auch den Optimierungsassistenten verwenden, um zu bestimmen, mit welchen Indizes eine bestimmte Abfrage oder Auslastung die beste Leistung erzielt.

71
Cade Roux

Der mehrspaltige Index kann für Abfragen verwendet werden, die auf alle die 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 (es müssten alle Datensätze mit Spalte1 = 1 nachgeschlagen und dann jeweils Spalte2 und Spalte3 überprüft werden).

37
MobyDX

Ein Gegenstand, der vermisst worden zu sein scheint, sind Sterntransformationen. Index Intersection Operatoren lösen das Prädikat auf, indem sie die Menge der von den Prädikaten getroffenen Zeilen berechnen, bevor E/A-Vorgänge in der Faktentabelle ausgeführt werden. In einem Sternschema würden Sie jeden einzelnen Dimensionsschlüssel indizieren, und das Abfrageoptimierungsprogramm kann die Zeilen auflösen, die bei der Berechnung der Indexschnittstelle ausgewählt werden sollen. Die Indizes der einzelnen Spalten bieten hierfür die größte Flexibilität.

Wenn Sie Abfragen haben, die häufig einen relativ statischen Satz von Spalten verwenden, wird die Leistung erheblich verbessert, wenn Sie einen einzelnen Deckungsindex erstellen, der alle enthält.

Durch das Einfügen mehrerer Spalten in Ihren Index muss das Optimierungsprogramm nur dann direkt auf die Tabelle zugreifen, wenn sich eine Spalte nicht im Index befindet. Ich benutze diese viel in Data Warehousing. Der Nachteil ist, dass dies viel Overhead 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 vorkommen.

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.

7
Bob Probst