2009-04-27 7 views
49

Ich habe zusammengesetzte Indizes (Indizes für Sie mathematische Folk) auf Tabellen zuvor mit einer Annahme erstellt, wie sie funktionierten. Ich war nur neugierig, ob meine Annahme richtig ist oder nicht.Wie funktionieren zusammengesetzte Indizes?

Ich nehme an, dass wenn Sie die Reihenfolge der Spalten für den Index auflisten, Sie auch angeben, wie die Indizes gruppiert werden. Wenn Sie beispielsweise die Spalten a, b und c haben und den Index in der gleichen Reihenfolge a ASC, b ASC und c ASC angeben, wird der resultierende Index im Wesentlichen viele Indizes für jede "Gruppe" in a enthalten.

Ist das korrekt? Wenn nicht, wie wird der resultierende Index tatsächlich aussehen?

+0

Siehe hier: [SQL Server für Indizes] (http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-covering-indexes) für eine gute Erklärung – SQLMenace

+0

Dies scheint wie eine Zusammensetzung Index für mich CREATE NONCLUSTERED INDEX IDX_PeopleTest_Name_Id_FavoriteColor ON PeopleTest (Name, ID, FavoritColor) – SQLMenace

Antwort

54

Zusammengesetzte Indizes funktionieren wie normale Indizes, außer dass sie mehrere Werte enthalten.

Wenn Sie einen Index für die Felder (a, b, c) definieren, werden die Datensätze zuerst auf a, dann b, dann c sortiert.

Beispiel:

| A | B | C | 
------------- 
| 1 | 2 | 3 | 
| 1 | 4 | 2 | 
| 1 | 4 | 4 | 
| 2 | 3 | 5 | 
| 2 | 4 | 4 | 
| 2 | 4 | 5 | 
+7

Bitte beachten Sie auch, dass Indizes als Btree gespeichert werden, so dass ein (a, b, c) Index bei einer Suche auf (a) und auf (a, b) hilft, aber * nicht * bei anderen Suchen wie (b) oder (b, c). – aexl

3

Nein. Ergebnisindex ist ein einzelner Index, aber mit zusammengesetzten Schlüssel.

SchlüsselX = A, B, C, D; KeyY = 1,2,3,4;

Index KEYX wird Keyy tatsächlich: A1, A2, A3, B1, B3, C3, C4, D2

so dass im Falle Sie etwas von KEYX und Keyy finden müssen - das wird schnell und wird einen einzelnen Index verwenden. Etwas wie SELECT ... WHERE KeyX = "B" UND KeyY = 3.

Aber es ist wichtig zu verstehen: WHERE KeyX =? Anfragen wird diesen Index verwenden, während WHERE KeyY =? wird NICHT verwenden solche Index überhaupt.

+0

Die letzte Behauptung ist nicht wahr auf Oracle. Siehe http://stackoverflow.com/questions/57878/sql-oracle-when-indexes-on-multiple-columns-can-be-used (ignoriere die - falsche - akzeptierte Antwort). – Hobo

+0

@Hobo: 1. In den meisten RDBMS überspringen Scan nicht verfügbar. 2. In den meisten Situationen wäre das sehr langsam, nur ein bisschen schneller (und manchmal sogar langsamer) als ein einfacher Tabellenscan (in sehr seltenen Situationen wird es wirklich helfen). Keine Magie in Oracle. Nur eine gute Regel zu erinnern - nicht auf Verbundindex verlassen, wenn Ihre Kriterien nicht nur Top-Level-Spalten aus dem Index (das ist sehr häufig Fehler beim Erstellen große zusammengesetzte Indizes). – Mash

+0

@Mash Punkte genommen.Definitiv nicht zu sagen Skip-Scans sind ein Wundermittel, nur dass es Situationen gibt, in denen KeyY =? _will_ verwenden einen Index. Es ist am besten, ein möglichst vollständiges Bild zu geben. Was die Geschwindigkeit betrifft, würde hoffen, dass der Optimierer den geeigneten Ansatz wählen würde (obwohl er, wie immer, eher messen würde, als im Zweifelsfall anzunehmen) – Hobo

17

Die häufigste Anwendung von Indizes verwendet B-Bäumen etwas schnelle Lookups zu ermöglichen und auch einigermaßen schnellen Bereichsscans. Es ist zu viel zu erklären, aber hier ist der Wikipedia-Artikel auf B-trees. Und Sie haben Recht, die erste Spalte, die Sie im create-Index deklarieren, ist die Spalte hoher Ordnung im resultierenden B-Baum.

Eine Suche in der Spalte hoher Ordnung ergibt einen Bereichsscan, und ein B-Baum-Index kann für eine solche Suche sehr nützlich sein. Der einfachste Weg, dies zu sehen, ist analog zu den alten Kartenkatalogen, die Sie in Bibliotheken haben, die noch nicht in Online-Kataloge umgewandelt wurden.

Wenn Sie nach allen Karten für Autoren suchen, deren Nachname "Clemens" ist, gehen Sie einfach zum Autorenkatalog und finden sehr schnell eine Schublade mit der Aufschrift "CLECLI" auf der Vorderseite. Das ist die richtige Schublade. Jetzt machen Sie eine Art informelle binäre Suche in dieser Schublade, um schnell alle Karten zu finden, auf denen "Clemens, Roger" oder "Clemens, Samuel" steht.

Angenommen, Sie möchten alle Karten für die Autoren finden, deren Vorname "Samuel" ist. Jetzt bist du am Bach, denn diese Karten sind nicht an einem Ort im Autorenkatalog zusammengefasst. Ein ähnliches Phänomen tritt bei zusammengesetzten Indizes in einer Datenbank auf.

Verschiedene DBMSe unterscheiden sich darin, wie schlau ihr Optimierer beim Ermitteln von Indexbereichsscans ist, und schätzen ihre Kosten genau ein. Und nicht alle Indizes sind B-Bäume. Sie müssen die Dokumente für Ihr spezifisches DBMS lesen, um die richtigen Informationen zu erhalten.

+0

danke, ich habe über dieses Problem schwer nachgedacht, ohne klare Antwort. "Eine Suche in der Spalte hoher Ordnung ergibt einen Bereichsscan", aber was ist, wenn der Index 2 Spalten umfasst und beide Spalten in einer Bereichsabfrage wie "SpalteA Schwellenwert 2 UND SpalteB threshold4 ", es scheint, dass Orakel MULTIPLE Range Scans auf dem B-Baum ausgeben müsste, oder? dann, wenn wir viele Spalten im zusammengesetzten Index haben, müssen wir VIELE Bereichsscans machen, und die Effektivität des Index wird stark reduziert. –

+0

In meiner Antwort meinte ich, dass ColumnA = Wert einem Bereichsscan entspricht, weil es viele geben kann Einträge, die alle den richtigen Wert für ColumnA aber unterschiedliche Werte für ColumnB aufweisen. Der Fall, den Sie skizzieren, ist ganz anders. Möglicherweise handelt es sich weiterhin um einen Bereichsscan, aber der Bereich könnte einen großen Prozentsatz der Einträge im Index enthalten. Je größer der Bereich, desto weniger erspart Ihnen der Index. Wenn der Wert für die Verwendung des Index zu niedrig wird, könnte der Optimierer eine andere Strategie wählen. –

28

Composite-Index ist wie eine Ebene Alphabetindex in einem Wörterbuch, aber, die zwei oder mehr Buchstaben, wie folgt aus:

AA - page 1 
AB - page 12 

usw.

Tabellenzeilen zuerst in dem von der ersten Spalte geordnet Index, dann durch den zweiten usw.

Es ist verwendbar, wenn Sie durch beide Spalten ODER durch erste Spalte suchen. Wenn Ihr Index ist wie folgt:

AA - page 1 
AB - page 12 
… 
AZ - page 245 
BA - page 246 
… 

Sie es für die Suche auf 2 Buchstaben (= 2 Spalten in einer Tabelle) verwenden können, oder wie ein normaler Index auf einem Buchstaben:

A - page 1 
B - page 246 
… 

Beachten Sie, dass in Bei einem Wörterbuch sind die Seiten selbst alphabetisch geordnet. Das ist ein Beispiel für einen CLUSTERED Index.

In einem einfachen, nicht CLUSTERED Index werden die Verweise auf Seiten geordnet, wie in einem Geschichtsbuch:

Gaul, Alesia: pages 12, 56, 78 
Gaul, Augustodonum Aeduorum: page 145 
… 
Gaul, Vellaunodunum: page 24 
Egypt, Alexandria: pages 56, 194, 213, 234, 267 

Composite-Indizes auch, wenn Sie ORDER BY zwei oder Spalten mehr verwendet werden kann. In diesem Fall kann eine Klausel DESC nützlich sein.

diesen Artikel in meinem Blog sehen über DESC Klausel in einem zusammengesetzten Index mit:

0

Mein Verständnis, Composite-Indizes arbeiten wie normale Indizes ist, außer sie Mehrwerte haben Schlüssel. Wenn Sie einen Index für die Felder definieren (a, b, c), da der zusammengesetzte Index daher in einem BinaryTree gespeichert wird, funktioniert Ihr Index nur nach Kombinationen von Suchen.

ABC 
AB 
A 

beispielsweise einen zusammengesetzten Index für eine Erstellung, b und c Feld entspricht getrennten Indizes a, ab der Erstellung und ABC.

Verwandte Themen