Gibt es irgendwelche Vorteile bei der bestimmten Reihenfolge der Spalten beim Definieren von Indizes

13

Zum Beispiel, wenn ich zwei Indizes habe:

CREATE INDEX IDX_1 ON MY_TABLE_1
 (ITEM, DATE, LOCATION)
 COMPUTE STATISTICS;

CREATE INDEX IDX_2 ON MY_TABLE_1
 (DATE, LOCATION, ITEM)
 COMPUTE STATISTICS;

Wäre das IDX_2überflüssig? Wenn nicht, wie bestimme ich die Reihenfolge der Deklaration der Spalten?

Sollte ich Indizes auf reguläre Abfragen zuschneiden?

Lewis Norton
quelle

Antworten:

12

Ja, der Vorteil ist, wenn Sie einen Teil des Index abfragen möchten. Wenn Sie die teilweise verwendeten Prädikate an die erste Stelle setzen, kann der Index für Abfragen verwendet werden, an denen diese Prädikate beteiligt sind, jedoch nicht alle Spalten im Index.

Sofern Sie keine anderen Anforderungen haben, kann es hilfreich sein, die selektivsten Prädikate an die erste Stelle zu setzen, da hierdurch Indexsuchvorgänge schneller reduziert werden können.

In Ihrem Fall IDX_2ist dies je nach Art der Abfragen in der Tabelle nicht unbedingt redundant. Es ist jedoch möglicherweise nicht erforderlich, alle Spalten einzuschließen. Wenn Sie zum Beispiel viele Abfragen nach locationund datedann durchführen, IDX_2kann dies hilfreich sein, um diese Abfragen zu lösen, da dies IDX_1nicht in der richtigen Reihenfolge erfolgt, um diesbezüglich hilfreich zu sein. Sie können jedoch feststellen, dass dies itemüberflüssig ist IDX_2.

Seit 9i hat Oracle einen "Skip Scan" -Operator eingeführt, mit dem nachgestellte Indexspalten effizienter abgefragt werden können, wodurch der Bedarf an zusätzlichen Indizes dieser Art verringert werden kann.

In einem spezielleren Fall kann die Abfrage, wenn Sie itemnach locationund dateohne weitere Spalten abfragen, vollständig über den Index aufgelöst werden, ohne dass etwas aus der Tabelle gelesen werden muss. Sie können auch abdeckende Indizes erstellen, an die nicht indizierte Spalten angehängt sind. Wenn alle erforderlichen Spalten aus dem Deckungsindex aufgelöst werden können, muss die Abfrage die Haupttabelle überhaupt nicht berühren.

Zum Schluss noch eine Antwort auf Ihre letzte Frage: Wenn Sie eine Reihe regelmäßig verwendeter Abfragen haben, die viel Ressourcen verbrauchen und mithilfe eines Indexes optimiert werden könnten, ist dies mit Sicherheit eine Überlegung wert. Das Verwalten von Indizes ist jedoch mit einem Mehraufwand für Einfügungen verbunden, sodass Sie die Abfrageleistung gegen den Mehraufwand abwägen müssen, den die Indizes für Einfügungs- oder Aktualisierungsvorgänge verursachen.

Betroffen vonTunbridgeWells
quelle
3
@ConcernedOfTunbridgeWells: Ein alternativer Ansatz besteht darin, die Indexschlüsselkomprimierung zu verwenden und die Spalten mit weniger Selektivität (weniger eindeutigen Werten) zu führen. Dies führt zu einem kleineren Index, während Skip-Scans weiterhin einwandfrei funktionieren.
Adam Musch
2

Eine weitere zu berücksichtigende Sache sind Spalten mit vielen Nullwerten.

Wenn nach diesen Spalten im Index Spalten angegeben sind, müssen die Nullwerte indiziert werden. Ansonsten werden Nullwerte wie üblich nicht indiziert (dies setzt natürlich voraus, dass Sie einen B-Tree-Index verwenden).

Wenn Sie also Spalten mit einer großen Anzahl von Nullwerten haben, können Sie durch das Setzen dieser Spalten am Ende des Indexes erheblich Speicherplatz sparen.

Michal Tenenberg
quelle