OLTP Tabellenkompression

03.
August
2008

Wird es wieder mal eng im Tablespace?

In unserem heutigen Tipp wollen wir ein neues Feature der Oracle Datenbank 11g etwas näher vorstellen:

OLTP Tabellenkompression

Wird es wieder mal eng im Tablespace?

In unserem heutigen Tipp wollen wir ein neues Feature der Oracle Datenbank 11g etwas näher vorstellen:

OLTP Tabellenkompression

Als Erstes ein kurzer Blick zurück. Wie wurden Tabellen bisher komprimiert?

Direct Path Table Compression

  • Wurde eingeführt mit Oracle 9i Release 2
    • Unterstützt Compression bei "bulk load operations"(Direct Load, Insert /* + APPEND */)
  • Optimierter Kompressions-Algorithmus für relationale Daten
  • Verbesserte Performance bei Abfragen die große Datenmengen abrufen
  • Die Daten werden auf Datenblockebene komprimiert
  • Kompression kann auf Tabellen- oder Partitionsebene eingestellt werden
  • Kompression ist für Applikationen vollkommen transparent
  • Spürbare Verlangsamung bei Schreiboperationen

Nun zur aktuellen Neuerung in Oracle 11g

OLTP Tabellenkompression

Mit der aktuellen Datenbank Oracle 11g wurde die OLTP Tabellenkompression erweitert. Mit dem neuen Kompressions-Algorithmus werden auch "normale" DML Anweisungen (insert, update, delete) unterstützt.

Datensätze werden im ersten Schritt unkomprimiert in die Tabellen geschrieben. Erreicht ein Datenblock die PCTFREE-Grenze wird die Kompression gezündet und der Block komprimiert. Weitere Inserts landen wieder unkomprimiert im Block bis erneut die PCTFREE-Grenze erreicht wird.

Einige Vorteile kurz zusammengefasst:

  • Standard DML Operationen werden unterstützt
  • Keine Verlangsamung bei Schreiboperationen
  • Ungenutzte Speicherbereiche, die durch Löschoperationen entstehen, werden bei der Komprimierung beseitigt

Um OLTP Tabellenkompression nutzen zu können gilt es Folgendes zu beachten:

  • Database compatibility level muss auf 11.1 oder höher gesetzt werden
  • Neue Syntax erweitert die Compress Anweisung
    • compress [for {all | direct_load} operations]
    • DIRECT_LOAD (Default) komprimiert nur Direct Load Operationen
    • ALL für DML und Direct Load
  • Syntax für neue Tabellen:
    • create table my_tab1 compress for all operations
  • Syntax für bestehende Tabellen:
    • alter table my_tab2 compress
    • Achtung! Nur neue Datensätze werden komprimiert

Um die Platzersparnis zu verdeutlichen legen wir mit diesem Skript zwei Tabellen an, eine komprimiert, die andere unkomprimiert. Beide Tabellen werden auf identische Weise mit ca. 54.000 Datensätzen befüllt. Eine Abfrage auf die View USER_SEGMENTS zeigt uns, wie viel Platz durch die Komprimierung gespart werden kann.

create table uncompressed
as select * from all_objects
where 1=2;

create table compressed
compress for all operations
as select * from all_objects
where 1=2;

insert into uncompressed select * from all_objects
order by owner, status, object_type;

insert into compressed select * from all_objects
order by owner, status, object_type;

commit;

select segment_name, blocks, bytes /1024 kb
from user_segments
where segment_name like '%COMPRESS%';

SEGMENT_NAME                       BLOCKS         KB
------------------------------ ---------- ----------
COMPRESSED                            512       4096
UNCOMPRESSED                         1024       8192

Weiterführende Informationen zur OLTP Tabellenkompression und weiteren Neuerungen von Oracle 11g bekommen Sie in unserer Opens internal link in current windowSchulung "Oracle 11g Neuerungen".

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.