Advanced Index Compression in Oracle Database 12c (12.1.0.2)
von Ulrike Schwinn, Oracle Deutschland B.V. & Co. KG
Komprimierung im Index findet seit jeher in den sogenannten Bitmap Indizes statt, die speziell in Warehouse-Anwendungen bei Spalten mit geringer Kardinalität zum Einsatz kommen. Wegen des speziellen Locking-Verhaltens bietet die Verwendung von Bitmap Indizes besonders bei lesenden Zugriffen Vorteile. Weniger bekannt war lange Zeit die Tatsache, dass auch "normale" B*Tree Indizes komprimiert werden können - im sogenannten Key Compression Index. Im Gegensatz zum Bitmap Index ist kein spezielles Locking erforderlich. Das Prinzip der Index Key Compression beruht dabei auf der Eliminierung von sich wiederholenden Schlüssel-Werten (auch prefix genannt) eines nonunique single column- oder eines unique multicolumn- Index. Die sogenannte Index Key Compression (auch prefix compression) ist bereits seit Oracle 9i verfügbar und steht für B*Tree Indizes und IOTs (Index Organized Table) zur Verfügung. Wer mehr dazu erfahren möchte, kann den Tipp Indizes in der Datenbank: Monitoring und Komprimierung (Index Key Compression) dazu konsultieren. Allerdings ist der Einsatz von Index Key Compression nicht immer sinnvoll. Beispielsweise muss bei einem nonunique single column Schlüssel zusätzlich die ROWID Information genutzt werden, um den Schlüssel eindeutig zu machen. Dies kann zu einem gewissen zusätzlichen Overhead führen.
Im aktuellen Datenbank Release 12.1.0.2 gibt es endlich eine Lösung für solche Kandidaten - die Advanced Index Compression. Diese Art der Komprimierung kann eine bessere Compression Ratio liefern und erfordert im Gegensatz zur Prefix Compression keine Angabe der Präfixlänge (Anzahl der Spalten, die komprimiert wird). Die Advanced Index Compression ist auf Blockebene implementiert. Ist ein Block voll, wird automatisch komprimiert, falls dadurch Platz für weitere Zeilen geschaffen werden kann. Zusätzlich ist der gleichzeitige volle Zugriff auf den Index wie beim Prefix Index gewährleistet.
Um ein Beispiel für eine sinnvolle Verwendung zu geben, wird im folgenden die Testtabelle CUSTOMER_TEST (55500 Zeilen) verwendet - eine Kopie der SH.CUSTOMER Tabelle. Geändert wurde nur der Inhalt der Spalte CUST_POSTAL_CODE. CUST_POSTAL_CODE enthält nun 35502 unterschiedliche/eindeutige Werte und ca. ein Drittel (20000) sich wiederholende Werte. Überprüfen wir kurz die Umgebung.
Im ersten Schritt wird ein "normaler" B*Tree Index erzeugt und die Anzahl der Leaf Blöcke ausgegeben.
Um vorab zu testen, ob die neue Advanced Index Compression von Vorteil ist, kann eine Erweiterung des Compression Advisors verwendet werden. Als Eingabeparameter sind Werte für den Test Tablespace (USERS), das Schema (SH), den Index (B_CUST_POSTAL), den Objekttyp (DBMS_COMPRESSION.OBJTYPE_INDEX) und den neuen Compression Typ (DBMS_COMPRESSION.COMP_INDEX_ADVANCED_LOW) notwendig. Das folgende Beispiel Skript zeigt eine Anwendung.
Wie man leicht erkennen kann, werden nur noch 116 Leaf Blöcke (Block count compressed) geschätzt. Nun überprüfen wir das Ganze mit der tatsächlichen Objekt Compression. Die neue Syntax lautet COMPRESS ADVANCED LOW und kann im ALTER und CREATE INDEX Kommando verwendet werden. Es gibt übrigens (noch) kein COMPRESS ADVANCED HIGH, auch wenn diese zusätzliche Syntaxform nahe liegt.
Die Schätzung war gut. Der Index hat jetzt nur noch 115 Leaf Blöcke. Um das Beispiel zu vervollständigen, ändern wir die Art der Komprimierung in Key Compression und überprüfen erneut die Anzahl der Leaf Blöcke.
Das Ergebnis zeigt die Verwendung von 145 Leaf Blöcke - die Anzahl ist sogar höher als beim normalen B*Tree Index.
Hinweis: Das Beispiel soll nur als kleiner Einstieg in die Technologie dienen. Diese Art der Komprimierung kann natürlich auch in Multicolumn Indizes bzw. bei partitionierten Indizes Verwendung finden.
Lizenzierung: Bitte beachten Sie, dass die Nutzung der COMPRESS ADVANCED LOW Syntax die Lizenzierung der Advanced Compression Option erfordert.
Zurück zur Community-Seite
|