Mehrfachindizierung in 12c (multiple indexes on same set of columns)
von Ulrike Schwinn, Oracle Deutschland B.V. & Co. KG
Wenn es um Schemaänderungen geht, können auch Indizes betroffen sein. Seit 11g gibt es die Möglichkeit, statt des Indexlöschens ein Umschalten auf INVISIBLE durchzuführen. Das Indexsegment bleibt dabei weiter bestehen. Der INVISIBLE Index wird vom Optimizer dabei nicht mehr verwendet. Dieses Feature stellt eine wichtige Vereinfachung beim Umgang mit Indizes dar. Allerdings kann eine Spaltenkombination (mit gleicher Spaltenreihenfolge) nicht mit Indizes unterschiedlichen Typs (Mehrfachindizierung) belegt werden. Es könnte beispielsweise sinnvoll sein, Bitmap Indizes für Datawarehouse Abfragen anstatt B-Tree Indizes zu verwenden. Ähnliche Beispiele könnte man sich auch mit globalen und lokalen Indizes vorstellen. Der Versuch einer Mehrfachindizierung in 11g würde im Fehler ORA-01408 resultieren.
In diesem Fall müsste man den Index wirklich löschen und wieder neuanlegen. Mit 12c ändert sich dieses Verhalten! Es ist jetzt möglich durch die Mehrfachindizierung die Indizierungsart zu ändern. Daher ist gewährleistet, dass zu jeder Zeit Indizes auf dieser Spaltenkombination vorhanden sind. Dieses Feature wird im Englischen auch mit "multiple indexes on same set of columns" bezeichnet. Eine wichtige Voraussetzung dazu ist, dass immer nur ein Index zu einer Zeit für den Optimizer verwendbar ist.
Nehmen wir in folgenden Beispielen die Kopie CUSTOMER_COPY der Tabelle CUSTOMERS, die im Moment noch keine Indizes besitzt. Im ersten Beispiel werden die Spalten CUST_FIRST_NAME und CUST_LAST_NAME indiziert.
Die nächsten Beispiele zur Index Erzeugung sollen die gleiche Spaltenmenge (in gleicher Spaltenreihenfolge) - allerdings mit der Eigenschaft Bitmap - verwenden. Dies ist auch in Oracle Database 12c nicht ohne Weiteres möglich. Das erfolgreiche Anlegen dieser Indizes erfordert noch den Zusatz INVISIBLE.
Hinweise: Es ist natürlich ebenso möglich, einen bestehenden Index mit dem Kommando ALTER INDEX in INVISIBLE umzuwandeln und danach weitere Indizes anzulegen.
Folgende Indizes stehen nun zur Verfügung. Wir verwenden die Views USER_INDEXES und USER_IND_COLUMNS, um die genaue Spaltenindizierung zu überwachen.
Vergessen Sie bitte dabei nicht, dass alle Indizes - mit der Eigenschaft VISIBLE oder INVISIBLE - Speicherplatz verbrauchen. Überprüfen kann man den Speicherplatzverbrauch mit USER_SEGMENTS.
Dabei gelten folgende Regeln für die Indizes:
- Die Indizes müssen von verschiedenem Typ sein, d.h. B-Tree, Bitmap, Reverse Key usw.
Ausnahmen bilden B-Tree und B-Tree Cluster Indizes sowie B-Tree und Index Organized Tables (IOTs). Übrigens sind auch für komprimierte und unkomprimierte Indizes ausgenommen.
- Die Indizes sind verschieden partitioniert.
Sie können also partitioniert oder nicht partitioniert und lokal oder global partitioniert sein; oder sie unterscheiden sich in der Partitionierungsart wie z.B. HASH oder RANGE.
- Die Indizes haben verschiedene UNIQUE und NON UNIQUE Eigenschaften.
Welche weiteren Vorteile kann diese Technik bieten? Da INVISIBLE Indizes vom Optimizer normalerweise nicht verwendet werden, kann man damit auch Indizes verschiedenen Typs sehr einfach testen. Folgendes Beispiel zeigt einen kleinen Indextest. Wir testen eine Abfrage auf die CUSTOMER_COPY Tabelle. Bei der ersten Abfrage wird der Index I_LAST_NAME verwendet.
Möchte man dieses Verhalten ändern, damit auch die INVISIBLE Indizes in Betracht kommen, setzt man den Session Parameter OPTIMIZER_USE_INVISIBLE_INDEXES auf TRUE. Unsere Abfrage verwendet nun den Bitmap Index I_BITMAP_LAST_NAME.
Lizenzierung
Die Nutzung dieses Features steht in allen Editionen zur Verfügung.
Weitere Informationen
Zurück zur Community-Seite
|