
| Block Physikalische Speichereinheit von Oracle Datenbanken. |
| PCTFREE Freier Bereich im Block für spätere Änderungen. |
| IOT Index Organized Tables; Tabellen, die in der Regel nur noch aus einem Index bestehen. |
| DBA_OBJECTS Oracle-interne Tabelle mit Data Dictionary Einträgen. |
| PGA-Speicher Prozessspeicher für Sortierungen. |
Data-Warehouse-Umgebungen bestehen sehr häufig aus wenigen großen Tabellen, die teilweise redundante Informationen enthalten. Mit Blick auf Speicherkapazitäten und Zugriffszeiten kommt der Wunsch auf, die Daten in komprimierter Form abzulegen.
Mit der Oracle 9i R2 Enterprise-Version wurde die DATA SEGMENT COMPRESSION eingeführt. Um einen Überblick über den Einsatz dieser Option zu bekommen, möchten wir zunächst die Arbeitsweise, die Konfigurationsmöglichkeiten und die Verwendung darstellen.
Anschließend geben einige Beispiele aus einem aktuellen Projekt einen ersten Eindruck zu der möglichen, zu realisierenden Platzersparnis und zeigen die Auswirkungen auf die Performance auf. Eine weitere Möglichkeit zur Komprimierung von Daten ist die KEY COMPRESSION. Sie kann bei Indizes bzw. indexorganisierten Tabellen (IOT) verwendet werden. Dieses Feature werden wir in diesem Artikel jedoch nicht behandeln.
Die Datenkompression erfolgt auf Blockebene. Beim Einfügen in die Tabelle wird nach mehrfach auftretenden Datenwerten innerhalb eines Blocks gesucht. Für diese wird in jedem Block ein eigener Bereich reserviert. In diesem Bereich liegt die so genannte Symbol-Tabelle. Mehrfach auftretende Datenwerte werden ausschließlich in der Symboltabelle gespeichert.
Im restlichen Platz innerhalb des Blocks werden die eigentlichen Datensätze gespeichert. Diese enthalten für die komprimierten Datenwerte Zeiger auf die Symboltabelle.
Die Platzersparnis ergibt sich aus der Verwendung der Zeiger, die weniger Speicherplatz als die Datenwerte erfordern. Abbildung 1 zeigt das Prinzip der Datenspeicherung innerhalb eines Blocks einer normalen beziehungsweise einer komprimierten Tabelle.
Die dargestellten Datensätze würden in komprimierter Form 291 Byte und unkomprimiert 379 Byte belegen. In einem Block einer komprimierten Tabelle existieren komprimierte und unveränderte Datenwerte und Datensätze nebeneinander.
Die wesentlichen Eigenschaften dieser Kompression auf Blockebene sind Folgende:
![]() |
| Abb. 1: Prinzip der Speicherung von Daten in einer normalen und in einer komprimierten Tabelle. (vergrößern) |
-- Anlegen einer komprimierten Tabelle
CREATE TABLE podium_le_tour_comp
( jahr DATE,
name VARCHAR2(100),
platz Number,
team VARCHAR2(100) )
COMPRESS;
|
| Abb. 2: Anlegen einer komprimierten Tabelle. |
Um eine komprimierte Tabelle zu erstellen, wird beim Anlegen die Option COMPRESS angegeben (siehe Abbildung 2). Damit wird die Eigenschaft COMPRESSION der Tabelle auf „ENABLED„ gesetzt. Beim Einfügen von Daten werden dann zunächst die Möglichkeiten einer Komprimierung getestet.
Sehr wichtig ist auch, dass der Speicherparameter PCTFREE automatisch den Wert "0" erhält. Es wird also kein Puffer für eventuelle Updates gelassen. Dies ist jedoch auch nicht notwendig, da Updates dem Konzept der Komprimierung widersprechen.
Nachträgliche Änderungen der Daten einer komprimierten Tabelle führen zunächst zu einer Dekomprimierung. Nach der Änderung werden die Datensätze dann in unkomprimierter Form wieder eingefügt. Dadurch geht die angestrebte Platzersparnis also verloren.
-- Umwandeln einer bestehenden Tabelle -- normal -> komprimiert ALTER TABLE tab_name MOVE COMPRESS; -- komprimiert -> normal ALTER TABLE tab_name MOVE NOCOMPRESS; |
| Abb. 3: Befehle zum umwandeln einer bestehenden Tabelle. |
Weitere Möglichkeiten der Verwendung der Eigenschaft COMPRESSION sind:
Die Datenkompression erfolgt ausschließlich beim Einfügen von Daten in die Tabelle. Das beschriebene Verfahren wird jedoch nur angewandt, wenn mehrere Datensätze in einer Aktion eingefügt werden. Bei Datenmengen, die kleiner als ein Block sind, wird keine Kompression durchgeführt. Zum Einfügen muss eine der folgenden Blockoperationen (BULK LOAD oder BULK INSERT) verwendet werden:
Wird keine der hier aufgeführten Möglichkeiten benutzt, werden die Datensätze in normaler Form, also ohne Kompression, eingefügt.
Bei der Umwandlung einer bestehenden Tabelle in eine komprimierte mit "ALTER TABLE ... COMPRESS;" wird nur die Eigenschaft umgeschaltet. Die bestehenden Datensätze werden nicht geändert. Dies erfolgt erst mit den in Abbildung 3 aufgeführten Befehlen mit dem Zusatz "MOVE".
Bei der Ausführung wird eine neue Tabelle mit der Eigenschaft COMPRESSION angelegt. Danach erfolgt das Einfügen der Daten in komprimierter Form, das Löschen der alten Tabelle und das Umbenennen der neuen Tabelle.
Die Auswirkungen der Datenkompression hängen stark von der jeweiligen Tabelle ab. Wir wollen hier beispielhaft mit den Daten aus DBA_OBJECTS allgemeine Trends aufzeigen.
In Abbildung 4 sind die Unterschiede beim Anlegen mit "CREATE TABLE ... AS SELECT * FROM dba_objects;" dargestellt. Die komprimierte Tabelle belegt nur noch 43 Prozent des ursprünglichen Platzes. Daraus ergeben sich weniger Schreiboperationen bei den Daten und beim Redo-LOG. Auf der anderen Seite sind die CPU-Belastung und der PGA-Speicherverbrauch deutlich angestiegen.
| Typ | CPU used | pga memory | Physical writes | redo size |
| NOCOMPRESS | 101 | 1.123.272 | 1407 | 11.649.765 |
| COMPRESS | 360 | 4.203.464 | 604 | 4.995.936 |
| Abb. 4: Ergebnisse für das Anlegen einer Tabelle mit NOCOMPRESS bzw. COMPRESS. | ||||
Wie sieht das nun beim Zugriff auf die Daten aus? Diese Frage ist quantitativ noch schwieriger zu beantworten, da sie entscheidend durch die jeweilige Abfrage beeinflusst wird. Bei einem FULL TABLE SCAN spielt das geringere Datenvolumen eine entscheidende Rolle. Bei wiederholten Zugriffen auf die Daten einer komprimierten Tabelle wird es die Tatsache sein, dass mehr Datensätze im Puffer gehalten werden können. Es ist auf jeden Fall mit einer höheren CPU-Belastung zu rechnen, da die Daten für die Verwendung entkomprimiert werden müssen.
| Tabelle T_NO_COMP | Tabelle T_COMP | |
| Anzahl Zeilen | 5897468 | 5897468 |
| Anzahl Blöcke | 64094 | 13782 |
| CREATE TABLE ... | 38 Sekunden | 117 Sekunden |
| 1. SELECT Anzahl (alle) | 22 Sekunden | 5 Sekunden |
| 2. SELECT Anzahl (alle) | 9 Sekunden | 3 Sekunden |
| 1. SELECT Anzahl (unterschiedliche) | 47 Sekunden | 35 Sekunden |
| 2. SELECT Anzahl (unterschiedliche) | 40 Sekunden | 33 Sekunden |
| Abb. 5: Beispiel für die Auswirkungen der Kompression auf die Größe, das Erstellen und typische Abfragen. | ||
Die möglichen Auswirkungen der Kompression lassen sich am Besten an einem praktischen Beispiel aus einem aktuellen Projekt verdeutlichen. In Abbildung 5 sind dazu Informationen zu einer Tabelle dargestellt, die sich gut für eine Kompression eignet.
Die komprimierte Tabelle belegt nur noch ca. 22 Prozent des ursprünglichen Platzes. Für typische Abfragen sind dann Ausführungszeiten angegeben und zwar
Jetzt kommen wir zu der entscheidenden Frage: Wann eignet sich eine Tabelle für den Einsatz der Datenkompression?
Absolut nicht geeignet sind Tabellen, wenn die Daten mit Einzeloperationen eingefügt und/oder durch UPDATEs verändert werden. Dann bewirkt die Kompression im günstigsten Fall nichts. Bei regelmäßigen UPDATEs wirkt sie sich sogar negativ auf Platzbedarf und Performance aus.
Sehr gut geeignet sind Tabellen, die folgende Bedingungen erfüllen:
Die Datenkompression ist keine Allzweckwaffe. Sie führt jedoch, wie das Beispiel aus der Praxis gezeigt hat, in Einzelfällen zu enormer Platzersparnis und bringt auch einen Performancegewinn. Vor der Anwendung der Kompression für eine Tabelle ist jedoch eine genaue Analyse der Auswirkungen auf das Einfügen der Daten und die Ausführungszeiten von typischen Abfragen notwendig.
Dr. Klaus Uebelgünn (info@ordix.de).