Ein Index kann eine, zwei oder mehr Spalten enthalten. Ein Index für eine oder mehr Spalten wird zusammengesetzter Index genannt. Mit der folgenden Anweisung wird beispielsweise ein zweispaltiger zusammengesetzter Index erstellt.
CREATE INDEX name ON Employees ( Surname, GivenName ); |
Ein zusammengesetzter Index ist sinnvoll, wenn die erste Spalte allein keine hohe Selektivität bietet. Ein zusammengesetzter Index für Surname und GivenName ist beispielsweise nützlich, wenn viele Angestellte den gleichen Nachnamen haben. Für EmployeeID und Surname wäre ein zusammengesetzter Index nicht sinnvoll, da jeder Mitarbeiter eine eindeutige Kennung besitzt, sodass die Spalte Surname keine zusätzliche Selektivität bringt.
Durch zusätzliche Spalten in einem Index können Sie zwar Ihre Suche eingrenzen, doch ist ein zweispaltiger Index nicht dasselbe wie zwei separate Indizes. Ein zusammengesetzter Index ist wie ein Adressbuch aufgebaut: Zuerst werden die Adressaten nach Nachnamen und dann alle Personen mit demselben Nachnamen nach ihrem Vornamen sortiert. Ein Adressbuch ist nützlich, wenn Sie den Nachnamen kennen. Es ist sogar noch nützlicher, wenn Sie den Vornamen und den Nachnamen kennen - doch es nützt Ihnen nichts, wenn Sie nur den Vornamen, aber nicht den Nachnamen kennen.
Wenn Sie zusammengesetzte Indizes erstellen, sollten Sie sich die Reihenfolge der Spalten genau überlegen. Zusammengesetzte Indizes sind sinnvoll bei Suchen in allen Spalten des Indexes oder nur in der ersten Spalte, nicht aber für die Suche nur in nachfolgenden Spalten.
Wenn Sie wahrscheinlich viele Suchvorgänge nur für eine Spalte durchführen, dann sollte diese Spalte die erste im zusammengesetzten Index sein. Wenn Sie wahrscheinlich einzelne Suchvorgänge für beide Spalten eines zweispaltigen Indexes durchführen, ist es eventuell ratsam, einen zweiten Index zu erstellen, der nur die zweite Spalte enthält.
Angenommen, Sie erstellen beispielsweise einen zusammengesetzten Index für zwei Spalten. Eine Spalte enthält die Vornamen der Mitarbeiter, die andere ihre Nachnamen. Sie könnten einen Index erstellen, der die Vornamen und dann die Nachnamen enthält. Oder Sie indizieren die Nachnamen und dann die Vornamen. Obwohl diese beiden Indizes die Informationen in beiden Spalten ordnen, haben sie unterschiedliche Funktionen.
CREATE INDEX IX_GivenName_Surname ON Employees ( GivenName, Surname ); CREATE INDEX IX_Surname_GivenName ON Employees ( Surname, GivenName ); |
Angenommen, Sie möchten nach dem Vornamen John suchen. Der einzige nützliche Index ist der, der den Vornamen in der ersten Spalte des Indexes enthält. Der Index, der den Nachnamen vor dem Vornamen enthält, ist unnütz, weil jemand mit dem Vornamen John überall im Index auftreten kann.
Wenn Sie glauben, dass Sie nach Mitarbeitern nur anhand ihres Vornamens bzw. ihres Nachnamens suchen werden, ist es sinnvoll, beide Indizes zu erstellen.
Oder Sie erstellen zwei Indizes, die jeweils nur eine der Spalten indizieren. Bedenken Sie allerdings, dass SQL Anywhere nur einen Index verwendet, um auf eine Tabelle zuzugreifen, während er eine einzelne Abfrage verarbeitet. Auch wenn Sie beide Namen kennen, ist es wahrscheinlich, dass SQL Anywhere zusätzliche Zeilen lesen muss, um die Zeilen mit dem korrekten zweiten Namen zu finden.
Wenn Sie wie im Beispiel oben einen Index mit dem CREATE INDEX-Befehl erstellen, ist die Reihenfolge der Spalten die, wie sie in Ihrem Befehl angeführt ist.
Standardmäßig werden die Spalten eines Indexes aufsteigend sortiert, sie können aber optional durch Angabe von DESC in der CREATE INDEX-Anweisung absteigend sortiert werden.
SQL Anywhere kann einen Index zur Optimierung einer ORDER BY-Abfrage verwenden, so lange die ORDER BY-Klausel nur Spalten enthält, die in diesen Index mit einbezogen sind. Außerdem müssen die Spalten im Index in genau derselben Weise (oder genau andersherum) sortiert sein wie in der ORDER BY-Klausel. Bei einspaltigen Indizes kann die Sortierreihenfolge stets optimiert werden, jedoch erfordern zusammengesetzte Indizes etwas mehr Überlegung. In der nachfolgenden Tabelle werden die Möglichkeiten für einen zweispaltigen Index aufgeführt.
Indexspalten | Optimierbare ORDER BY-Abfragen | Nicht-optimierbare ORDER BY-Abfragen |
---|---|---|
ASC, ASC | ASC, ASC oder DESC, DESC | ASC, DESC oder DESC, ASC |
ASC, DESC | ASC, DESC oder DESC, ASC | ASC, ASC oder DESC, DESC |
DESC, ASC | DESC, ASC oder ASC, DESC | ASC, ASC oder DESC, DESC |
DESC, DESC | DESC, DESC oder ASC, ASC | ASC, DESC oder DESC, ASC |
Ein Index mit mehr als zwei Spalten folgt der gleichen allgemeinen Regel wie oben. Angenommen, Sie haben beispielsweise den folgenden Index:
CREATE INDEX idx_example ON table1 ( col1 ASC, col2 DESC, col3 ASC ); |
In diesem Fall können die folgenden Abfragen optimiert werden:
SELECT col1, col2, col3 FROM table1 ORDER BY col1 ASC, col2 DESC, col3 ASC; |
SELECT col1, col2, col3 FROM example ORDER BY col1 DESC, col2 ASC, col3 DESC; |
Der Index wird nicht zum Optimieren einer Abfrage verwendet, die ein anderes Muster von ASC und DESC in der ORDER BY-Klausel aufweist. Die folgende Anweisung ist beispielsweise nicht optimiert:
SELECT col1, col2, col3 FROM table1 ORDER BY col1 ASC, col2 ASC, col3 ASC; |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |