Logo Oracle Deutschland   DBA Community  -  Dezember 2009 (zuletzt ergänzt Juli 2011)
Speicherplatzeinsparung durch Komprimierung und der Compression Advisor dbms_compression
von Ulrike Schwinn, ORACLE Deutschland GmbH

Speicherplatzeinsparungen und Performanceverbesserungen sind zwei wichtige Argumente für den Einsatz von Komprimierung in der Datenbank. Mit Oracle Database 11g sind zusätzlich neue Algorithmen und Funktionen hinzugefügt worden, die die Komprimierung für die Praxis noch interessanter machen können. Je nach Algorithmus kann dabei ein grosser Anteil des urspünglichen Platzes eingespart werden. Bevor die Performanceverbesserung beispielsweise mit dem Real Application Testing Werkzeug getestet wird, wird daher in der Regel im ersten Schritt die Einsparung an Speicherplatz überprüft.

Wie kann man den Grad der Speicherplatzeinsparung feststellen? Naheliegend ist, neue Segmente mithilfe der neuen Speichereinstellung zu erstellen und dann den Quotient aus nicht komprimierten und komprimierten Objekten - die sogenannte Compression Ratio - zu berechnen. Eine Alternative ist die Nutzung des neuen Compression Advisors in 11g Release 2, der ohne zusätzliche Installation mit dem Package DBMS_COMPRESSION zur Verfügung steht. Abgesehen von der Compression Ratio für OLTP Compression bietet dieser Compression Advisor weitere interessante Funktionen.

Hat man allerdings noch keinen Zugriff auf eine 11g Release 2 Installation, kann man Unterstützung durch eine zusätzliche Package-Installation erhalten. Download und Nutzungsbeschreibung dazu findet sich auf OTN. Im Unterschied zur 11g Release 2 Funktionalität muss man bei der Nutzung mit einigen Einschränkungen rechnen. So ist dieses Package beispielsweise nicht für partitionierte Tabellen geeignet. Ausserdem werden nicht alle Komprimierungsalgorithmen unterstützt. Der folgende Beitrag konzentriert sich auf die Funktionsweise des Compression Advisors in 11g Release 2 und gibt darüberhinaus Tipps zur Anwendung von Komprimierung.

Bestimmung der Compression Ratio: OLTP Komprimierung
Im ersten Fall soll die Compression Ratio bestimmt werden. Der Aufruf der Prozedur GET_COMPRESSION_RATIO benötigt einige IN Parameter und liefert das Ergebnis über die vorgegebenen OUT Parameter. Besitzt die Tabelle Partitionen, wird die Ratio pro Partition berechnet. In folgendem Beispiel wird die Partition COSTS_Q1_1998 der Tabelle COSTS des Users SH überprüft. Der überprüfte Komprimierungstyp ist die OLTP Komprimierung.

Hinweis: Es müssen ausreichende Zugriffsrechte und Platz im Tablespace SCRATCHTBSNAME existieren. Am Besten führt man die Prozedur daher mit einem User aus, der DBA-Privilegien besitzt.

set serveroutput on

declare
  b_cmp          PLS_INTEGER;
  b_uncmp        PLS_INTEGER;
  row_cmp        PLS_INTEGER;
  row_uncmp      PLS_INTEGER;
  cmp_ratio      NUMBER;
  cmp_str        VARCHAR2(200);
begin
     DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
 SCRATCHTBSNAME         => 'USERS', 
 OWNNAME                => 'SH', 
 TABNAME                => 'COSTS',
 PARTNAME               => 'COSTS_Q1_1998',
 COMPTYPE               => DBMS_COMPRESSION.COMP_FOR_OLTP,
 BLKCNT_CMP             => b_cmp,
 BLKCNT_UNCMP           => b_uncmp,
 ROW_CMP                => row_cmp,
 ROW_UNCMP              => row_uncmp,
 CMP_RATIO              => cmp_ratio, 
 COMPTYPE_STR           => cmp_str);
  
 dbms_output.put_line('# Blocks compressed      => '||  b_cmp);
 dbms_output.put_line('# Blocks uncompressed    => '||  b_uncmp);
 dbms_output.put_line('Ratio                    => '||  cmp_ratio);
 dbms_output.put_line('Komprimierungstyp        => '||  cmp_str);
end;
/

# Blocks compressed     => 10
# Blocks uncompressed   => 20
Ratio                   => 2
Komprimierungstyp       => Compress For OLTP
Das Ergebnis zeigt, dass durch den Einsatz von OLTP Komprimierung eine Ratio von 2 erreicht werden kann.

Bestimmung der Compression Ratio: weitere Komprimierungsarten
Ein Blick in das Handbuch (siehe Tabelle mit Komprimierungstypen) zeigt, dass auch die neuen Exdata Hybrid Columnar Compression (kurz EHCC) Komprimierungsarten in 11g Release 2 mit diesem Package überpüft werden können.

Der Test ist möglich ohne Zugriff auf ein Exadata Storagesystem zu besitzen und ab Version 11.2.0.2 auch ohne eine zusätzliche Installation von Patches möglich. Eine Tabelle kann also auf das Einsparungspotential von vier weiteren Komprimierungstypen überprüft werden.

Im folgenden Beispiel wurde die Tabelle SALES_BIG aus der Tabelle SALES erzeugt und vergrössert. Der Test überprüft die Nutzung der HCC Komprimierung für den Archive Modus. Folgendes Beispiel zeigt die Verwendung.
declare
  b_cmp          PLS_INTEGER;
  b_uncmp        PLS_INTEGER;
  row_cmp        PLS_INTEGER;
  row_uncmp      PLS_INTEGER;
  cmp_ratio      NUMBER;
  cmp_str        VARCHAR2(200);
begin
DBMS_COMPRESSION.GET_COMPRESSION_RATIO (
  SCRATCHTBSNAME        =>'USERS',
  OWNNAME               =>'SH',
  TABNAME               =>'SALES_BIG',
  PARTNAME              =>'',
  COMPTYPE              =>DBMS_COMPRESSION.COMP_FOR_ARCHIVE_HIGH,
  BLKCNT_CMP            =>b_cmp,
  BLKCNT_UNCMP          =>b_uncmp,
  ROW_CMP               =>row_cmp,
  ROW_UNCMP             =>row_uncmp,
  CMP_RATIO             =>cmp_ratio,
  COMPTYPE_STR          =>cmp_str);
   
dbms_output.put_line('# Blocks compressed       => '||  b_cmp);
dbms_output.put_line('# Blocks uncompressed     => '||  b_uncmp);
dbms_output.put_line('Ratio                     => '||  cmp_ratio);
dbms_output.put_line('Compression-Typ           => '||  cmp_str);
end;
/
Das Ergebnis sieht dann folgendermassen aus.


Für eine größere Ansicht auf das Bild klicken.

Hinweis: Die Grösse der Tabelle sollte für den Test mit EHCC Komprimierung geeignet sein und mindestens 1 000 000 Zeilen speichern.

Nun stellt sich die Frage wie der Compression Advisor intern arbeitet. Generell werden zwei temporäre Tabellen im Tablespace SCRATCHTBSNAME erstellt, die nach der Berechnung der Ratio wieder gelöscht werden. Um die Verwendung der Ressourcen zu begrenzen, ist bei der EHCC Komprimierung die Anzahl der verwendeten Zeilen auf 1 000 000 Zeilen limitiert.

Bestimmung des Komprimierungstyps
Mithilfe des Funktion GET_COMPRESSION_TYPE kann sogar im Nachhinein der Komprimierungstyp einer bestimmten Zeile bestimmt werden. Dazu ist die Angabe der ROWID einer Tabelle erforderlich. Das Ergebnis ist eine Zahl, die den jeweiligen Komprimierungstyp angibt (siehe Tabelle mit Komprimierungstypen). Folgendes Beispiel zeigt eine Anwendung.
SQL> SELECT rowid FROM sales WHERE rownum<10;

ROWID                                                                           
------------------                                                              
AAAR+EAAFAAAAzDAAT                                                              
AAAR+EAAFAAAAzDADc                                                              
AAAR+EAAFAAAAzDADd                                                              
AAAR+EAAFAAAAzDADe                                                              
AAAR+EAAFAAAAzDADf                                                              
AAAR+EAAFAAAAzDADg                                                              
AAAR+EAAFAAAAzDADh                                                              
AAAR+EAAFAAAAzDADi                                                              
AAAR+EAAFAAAAzDAED                                                              

9 rows selected.

SQL>SELECT dbms_compression.get_compression_type('SH','SALES','AAAR+EAAFAAAAzDAED') typ 
  2 FROM dual;

       TYP                                                                      
----------                                                                      
         2                                                                      
            


Unterstützung durch den automatischen Segment Advisor
In 11g Release 2 ist die Funktionalität des automatischen Segment Advisors um die Empfehlung für OLTP Compression erweitert worden. Unter bestimmten Umständen beispielsweise Gröss▀e der Tabelle und Grösse der Platzeinsparung kann der automatische Segment Advisor nun auch OLTP Komprimierung als Empfehlung anzeigen und liefert ein Skript zur Durchführung.

Kurz zur Erinnerung: Mit Oracle 10g ist der sogenannte Segment Advisor eingeführt worden, der Platzverschwendung bzw. Row-Chaining eines Segments anzeigt und zusätzlich Skripte generiert, um Abhilfe beispielsweise mit SHRINK-Operationen zu schaffen. Der Segment Advisor kann dabei manuell über Packages oder automatisch in der täglich laufenden "Automatic Maintenance Task" ausgeführt werden. Folgender Ausschnitt zeigt das Ergebnis des automatischen Segment Advisor Laufs auf der Homepage der Enterprise Manager Console.


Für eine größere Ansicht auf das Bild klicken.

Folgende Screenshot-Serie zeigt die Empfehlung in mehreren Schritten an. Im ersten Schritt wird die Platzeinsparung im Tablespace USERS angegeben.


Für eine größere Ansicht auf das Bild klicken.

Klickt man auf den "Recommendation Details" Button werden die Segmente und das Einsparungspotential sichtbar. In unserem Fall handelt es sich um das Segment PROM_EXA, das 120 MB gross ist, 4 Indizes besitzt und durch OLTP Komprimierung 56 MB weniger Platz beanspruchen könnte:


Für eine größere Ansicht auf das Bild klicken.

Im letzten Screenshot sind die Kommandos aufgelistet, die zur Implementierung notwendig sind und automatisch über einen Scheduler Job ausgeführt werden können.


Für eine größere Ansicht auf das Bild klicken.

Tipps und Hinweise
Nicht unberücksichtigt sollten folgende Faktoren bleiben, da sie die Komprimierung wesentlich beeinflussen können.
  • Wahl der Blockgrösse des Tablespace
  • Sortiertes Laden
  • Ladevorgang als Bulk Load

Auch Indizes und unstrukturierte Daten nehmen einen Anteil am gesamten Speicherplatz ein und sollten in die Berechnung einfliessen. Der Compression Advisor liefert allerdings im aktuellen Release dazu keine Unterstützung. Bei Verwendung von unstrukturierten Daten ist es daher notwendig, die Compression Ratio durch Vergleich von komprimierten und unkomprimierten Daten über die Data Dictionary Views zu überprüfen. Der Tipp LOB-Management in 11g: Einstieg in die Nutzung von SECUREFILEs zeigt ein Anwendung. Weitere Informationen zu den Themen rund um das Einsparen von Speicherplatz in der Datenbank finden Sie beispielsweise auch in folgenden Beiträgen.
Mehr zu diesem Thema bzw. zu weiteren Themen rund um die Datenbank lesen Sie in den nächsten Ausgaben ...



Zurück zur Community-Seite