OR ACLE DOJO NR. 8 Tabellen, Large Objects, Indizes, RMAN, Data Pump, Netzwerk, Data Guard, Information Lifecycle Management Komprimierung in der Datenbank ULRIKE SCHWINN Oracle Dojo ist eine Serie von Heften, die Oracle Deutschland B.V. zu unterschiedlichsten Themen aus der Oracle-Welt herausgibt. Der Begriff Dojo [‘do:d3o] kommt aus dem japanischen Kampfsport und bedeutet Übungshalle oder Trainingsraum. Als „Trainingseinheiten“, die unseren Anwendern helfen, ihre Arbeit mit Oracle zu perfektionieren, sollen auch die Oracle Dojos verstanden werden. Ziel ist es, Oracle-Anwendern mit jedem Heft einen schnellen und fundierten Überblick zu einem abgeschlossenen Themengebiet zu bieten. Im Oracle Dojo Nr. 8 beschäftigt sich Ulrike Schwinn, Leitende Systemberaterin bei Oracle Deutschland B.V., mit dem weiten Feld der Datenkompression innerhalb der Oracle-Datenbank. Diese fundierte Einführung, die mit einer Vielzahl praxiserprobter Tipps abgerundet wird, hilft Speicherplatz zu sparen (und damit Geld) und macht zudem, quasi als „Nebenwirkung“, die meisten Anwendungen schneller! Inhalt 1 Einleitung 5 2 Tabellen mit strukturierten Daten 9 2.1 Basic Compression 9 2.2 OLTP Compression (auch Advanced Row Compression) 15 2.3 Hybrid Columnar Compression (HCC) 23 3 Index-Komprimierung 26 4 Tabellen mit unstrukturierten Daten 32 5 Compression Advisor 39 5.1 Bestimmung der Compression Ratio 42 5.2 Bestimmung des Komprimierungstyps 5.3 Rückrechnen von komprimierten Daten 6 6.1 Information Lifecycle Management Automatische Datenoptimierung 49 50 54 59 7 Data Pump, External Tables und RMAN 8 Netzwerkkomprimierung 71 9 Optimierung für Flashback-Data-Archive-Tabellen 10 Lizenzierung 77 11 Fazit und Ausblick 12 Weitere Informationen 80 79 65 74 OR ACLE DOJO NR. 8 ULRIKE SCHWINN Komprimierung in der Datenbank Tabellen, Large Objects, Indizes, RMAN, Data Pump, Netzwerk, Data Guard, Information Lifecycle Management VORWORT DES HER AUSGEBERS Wir leben in einer Zeit der massiven Datengenerierung. Immer mehr Daten fallen an, immer feingranularer werden Daten abgespeichert, immer länger werden Daten aufbewahrt. Mehr operative Daten bedeutet mehr Speicherplatz, der zur Verfügung gestellt werden muss und bedeutet – oft unterschätzt oder ignoriert –, dass mit noch größerer Sorgfalt an den Ver­fügbarkeitskonzepten wie auch an den Performancekonzepten gearbeitet werden muss. Waren gestern Systeme und Datenbanken im zweistelligen Gigabyte-Bereich eine bestaunenswerte Größenordnung, reden wir heute von ein-, zwei- oder dreistelligen Terabytes, und Petabytes sind nicht fern, bei manchen bereits Realität. Es ist einfach eine Frage der Vernunft und vor allem der Kosten, diese großen Datenbestände, die zu verarbeiten sind, möglichst effizient und kompakt zu speichern. Oracle hat die Problematik schon sehr früh erkannt und bereits mit Oracle 9i die ersten wichtige Schritte im Bereich Kompres­sionstechnologie innerhalb der Datenbank unter­ nommen. Heute, mit Oracle12c, steht ein ganzes Arsenal von Möglich­keiten zur Verfügung, um die Datenbestände immens zu ver­kleinern, damit Kosten zu sparen und insgesamt die Performance und vor allem die Handhabbarkeit der 3 4 Anwendungs­systeme zu erhöhen. Nun stehen unterschiedliche Kompressionstechnologien für unterschiedliche Zielobjekte (Tabellen, Indices, LOBs, Backups, Netzwerk) zur Verfügung, die – sinnvoll angewandt – eine signifikante Reduzierung des Platzbedarfs innerhalb einer Oracle-Datenbank herbeiführen. Sinnvoller Einsatz ist das Stichwort für dieses Dojo. Es hat zum Ziel, in die unterschiedlichen Themengebiete der Daten­kom­ pression und der Daten-Deduplikation innerhalb einer Oracle-­ Datenbank einzuführen. Ulrike Schwinn, Leitende System­beraterin bei Oracle Deutschland B.V., zeigt anhand vieler praxisorientierter Beispiele und wertvoller Tipps, wie man signifikant Speicherplatz und damit viel Geld einsparen kann. Testen Sie einfach die unterschiedlichen Technologien oder nutzen Sie den Compression Advisor, um die Kompressionsraten in Ihrem System, bei Ihren Tabellen – mit und ohne LOBs – oder Ihren Backups festzustellen. Ich bin sicher, dass Sie überrascht sein werden, wie viel Speicherplatz Sie einsparen können. Ich wünsche Ihnen viel Spaß beim Lesen und beim Testen. Ihr Günther Stürner Vice President Sales Consulting PS: Wir sind an Ihrer Meinung interessiert. Anregungen, Lob oder Kritik gerne an [email protected]. Vielen Dank! EINLEITUNG 1 Einleitung Schon seit vielen Jahren ist die Komprimierung von Daten ein wichtiger Bestandteil der Oracle-Datenbank und wird beständig weiterentwickelt. Dies zeigte sich besonders auch im Datenbankrelease 11g mit der Einführung von neuen Techniken im Zusammenhang mit der neuen Option Advanced Compression. Die Komprimierung ist nun bei­ spielsweise unabhängig vom Anwendungsworkload und zusätzlich um die Bereiche unstrukturierte Daten, BackupDaten und Netzwerk-Komprimierung (im Data-GuardUmfeld) erweitert worden. In Oracle Database 12c sind sogar Eigenschaften zur Ver­ besserung des Storage Management ergänzt worden. Im Wesentlichen handelt es sich dabei um zwei neue Features – die Heat Map und die automatische Datenoptimierung (Englisch Automatic Data Optimization). Die Heat Map „trackt“ Veränderungen und Abfragen auf Zeilen- und Segmentebene und gibt einen detaillierten Überblick über den Zugriff auf die Daten. Die automatische Daten­optimier­ ung verlagert und/oder komprimiert die Daten gemäß nutzerdefinierter Regeln (Englisch policies) basierend auf den Informationen, die sich aus der Heat Map ergeben. Beide zusammen helfen dabei, Information Lifecycle Management-Strategien in – und nicht außerhalb – der 5 6 EINLEITUNG Datenbank zu implementieren. Zusätzlich dazu bietet Oracle Database 12c eine Erweiterung der Netzwerkkom­ primierung, eine Optimierung der Flashback Data Archives und des Online Partition MOVE. Dieses Dojo gibt einen aktuellen Überblick über alle zur Verfügung stehenden Komprimierungsverfahren, die mit und ohne Lizenzierung der Advanced Compression Option zur Verfügung stehen, und illustriert die Hand­ha­ bung mit zusätzlichen Tipps und Tricks. Da die einzelnen Kapitel nur die fachliche Komponente und nicht in allen Fällen die lizenzrechtliche Sicht beleuchten können, findet sich am Ende des Dojo eine aktuelle Liste der zu lizenzierenden Features. Folgende Übersicht gibt zusätzlich einen kurzen Überblick über die umfassenden Möglichkeiten der Kompri­mierung in der Datenbank – aufgeteilt in die beiden Kategorien Basic und Advanced. Advanced steht dabei für die Features der Advanced Compression Option, Basic für die grundlegenden Komprimierungseigenschaften, die keine Lizenzierung der Advanced Compression Option erfordern. 7 EINLEITUNG Ebene Basic Komprimierung Advanced Komprimierung Strukturierte Basic Compression OLTP (Advanced Row) Daten – Tabelle Compression Unstrukturierte Advanced LOB Compression Daten – Advanced LOB Securefiles Index Deduplication Bitmap Index komprimierter B*Index Partition siehe Tabelle siehe Tabelle Tablespace siehe Tabelle siehe Tabelle RMAN Backup Algorithmus BASIC weitere Algorithmen wie LOW, MEDIUM und HIGH Data Pump External Table Metadaten alle Daten External Table Compression Data Guard Data Guard Redo Transport Netzwerk Advanced Network Compression Flashback Data Optimized Flashback Data Archive Archive Nicht berücksichtigt ist die Tabellenkomprimierungsart HCC (kurz für Hybrid Columnar Compression), die unabhängig von der Advanced Compression Option auf 8 EINLEITUNG speziellem Storage wie Exadata Storage Systemen, Sun ZFS Storage Appliance (Oracle NAS Storage) oder Axiom Storage (Oracle SAN Storage) ihre Verwendung findet. Ein Wort noch zum Setup und der Installation: Alle Komprimierungsarten stehen ohne zusätzliche lnstallation oder Aktivierung in der Datenbank zur Verfügung. Möchte man bestimmte Features verwenden, ist die Implementie­ rung durch die vorgegebene Syntax erforderlich. Im Umkehrschluss bedeutet dies aber auch, dass die Advanced Compression Option nicht ausgeschaltet werden kann. Es gilt der Grundsatz: Werden die entsprechenden Funktionen nicht verwendet, ist auch keine Lizenzierung erforderlich – wie übrigens auch im Fall von anderen Optionen (zum Beispiel bei der Partitioning Option). Basic Compression 2 Tabellen mit strukturierten Daten Daten in der Datenbank werden entweder als strukturierte oder als unstrukturierte Daten gespeichert. Bei strukturierten Daten handelt es sich beispielsweise um Ortsbezeichnungen, Kategorien, Namen usw., bei unstrukturierten Daten um Beschreibungen, Attachments oder Dokumente in unterschiedlichen Speicherformaten. Um eine effektive Speicherung zu gewährleisten, verwendet die Datenbank unterschiedliche Algorithmen bei der Komprimierung von Daten. Im folgenden Abschnitt liegt der Fokus zuerst auf den strukturierten Daten. Drei Komprimierungsverfahren stehen dabei zur Verfügung: • Basic (Table) Compression (auch Direct Load Compression) • OLTP Compression (auch Advanced Row Compression) •Hybrid Columnar Compression (auch Column Store Compression) 2.1 BASIC COMPRESSION Bereits seit Oracle Version 9.2 ist es möglich, relationale Tabellendaten zu komprimieren. Dabei handelt es sich um die sogenannte Basic Compression – auch Direct Load 9 10 Basic Compression Compression genannt. Bei der Komprimierung der Daten werden Mehrfacheinträge im Datenblock nur einmal gespeichert. Die sich wiederholenden Werte werden in einer sogenannten „Symbol Table“ auf Blockebene gespeichert und durch einen Pointer im Datenteil des Blocks adressiert (siehe Abbildung 1). Abb.1: Komprimierter und nicht-komprimierter Block im Vergleich Invoice ID Cust_Name Cust_Addr Sales_amt 1233033 Meyer 11 Homestead Rd 13.99 1212300 Meyer 11 Homestead Rd 1.99 1243012 Meyer 11 Homestead Rd 1.99 9923032 McGryen 3 Main Street 1.99 9833023 McGryen 3 Main Street 1.99 133056 McGryen 3 Main Street 1.99 Not Compressed Compressed Block Block Header Information 1233033 Meyer 11 Homestead Rd 13.99 | 1212300 Meyer 11 Homestead Rd | 1.99 | 1243012 Meyer 11 Homestead Rd | 1.99 | 9923032 McGryen 3 Main Street 1.99 | 9833023 McGryen 3 Main Street | 1.99 | 2133056 McGryen 3 Main Street | 1.99 Symbol Table Meyer 11 Homestead Rd | 1.99 McGryen 3 Main Street Raw Data 1233033 • • 13.99 | 1212300 1243012 • • • 9923032 98 33023 • • • 2133056 Free Space Basic Compression Dieser Komprimierungsalgorithmus ist sehr effizient. Durch die Tabellenkomprimierung kann eine größere Anzahl Zeilen in einem Block gespeichert werden, daher werden weniger „Buffer Get“-Operationen beziehungsweise I /Os durchgeführt. Dies führt dazu, dass nicht nur der Speicherplatzbedarf auf der Platte und im Memory verringert wird, sondern auch die Performance der Tabellenzugriffe erhöht werden kann. Des Weiteren existieren keine funktionalen­ Einschränkungen bei der Nutzung von zusätzlichen Datenbank-Features. Für den Einsatz ist allerdings die Lizenzierung einer Enterprise Edition erforderlich. Wichtig zu wissen ist, dass Basic Compression ausschließlich für Bulk-Load-Operationen genutzt werden kann. Dazu gehören folgende Operationen: • Direct Path Load beim SQL*Loader • CREATE TABLE AS SELECT •Paralleler INSERT •Serieller INSERT mit APPEND Hint und Subquery Klausel (auch Direct Path Insert) Konventionelle DML-Operationen werden mit dieser Art der Komprimierung nicht unterstützt. Zusätzlich gibt es weitere Einschränkungen, die beachtet werden sollten: Operationen­ 11 12 Basic Compression wie DROP COLUMN auf Tabellen mit Basic Compression sind nicht erlaubt; generell ist Basic Compression auf Index Organized Tables (IOTs) nicht möglich. Genauere Informa­ tionen dazu sollten im Handbuch Oracle Database SQL Language Reference nachgelesen werden. Tipp aus der Praxis: Auch Direct Path INSERT s unterliegen einigen Einschränkungen, die im Handbuch im Kapitel zum Kommando INSERT zu finden sind. Falls eine der Voraussetzungen bei der Verwendung nicht erfüllt wird, wird übrigens kein Fehler erzeugt, sondern automatisch auf eine konventionelle INSERT-Durchführung umgeschaltet. Die Konsequenz bei Verwendung der Basic-CompressionEigenschaft wäre dann, dass keine Komprimierung erfolgen würde. Ein typisches Beispiel ist die Verwendung von Constraints. Laut Handbuch gilt Folgendes: “The target table cannot have any triggers or referential integrity constraints defined on it.” Ein Direct Path INSERT schaltet also in einen konventionellen Load (INSERT ) um, sobald ein referenzielles Constraint eingeschaltet ist. Das Constraint auszuschalten stellt dazu einen einfachen Workaround, eine einfache Lösung dar. Folgender Code-Auszug illustriert das Beispiel. Dabei besitzt Tabelle EMP1 ein Foreign Key Constraint, das im Fall 1 ausgeschaltet und im Fall 2 eingeschaltet wird. 13 Basic Compression Fall 1 mit Direct Load SQL> alter table emp1 disable constraint FK_deptno; SQL> insert /*+ append */ into emp1 select * from scott.emp2; SQL> select * from table (dbms_xplan.display_cursor()); PLAN_TABLE_OUTPUT -----------------------------------------------------------------------SQL_ID 8ttnnub4m07rv, child number 0 -----------------------------------------------------------------------insert /*+ append */ into emp1 select * from scott.emp2 Plan hash value: 2748781111 -----------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -----------------------------------------------------------------------| 0 | INSERT STATEMENT | | | | | 1 | LOAD AS SELECT | | | | | 2 | TABLE ACCESS FULL | EMP2 | | 532 | 14 3 (100)| | 3 (0)| 00:00:01| 14 Basic Compression Fall 2 mit konventionellem Load SQL> alter table emp1 enable constraint FK_deptno; SQL> insert /*+ append */ into emp1 select * from scott.emp2; SQL> select * from table (dbms_xplan.display_cursor()); PLAN_TABLE_OUTPUT -----------------------------------------------------------------------SQL_ID 8ttnnub4m07rv, child number 0 -----------------------------------------------------------------------insert /*+ append */ into emp1 select * from scott.emp2 Plan hash value: 3956160932 -----------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes |Cost(%CPU)| Time | -----------------------------------------------------------------------| 0 | INSERT STATEMENT | | | | 3 | 1 | LOAD TABLE CONVENTIONAL| | | | | 2 | TABLE ACCESS FULL | EMP2 | 14 | 532 | 3 (100) | | (0) |00:00:01| Seit 11g Release 2 gibt es außerdem die Hint-Erweiterung APPEND_VALUES, die den Einsatz nun auch für Datenbank­ent­wickler interessant macht. Mit dem neuen Hint können Bulk-­Opera­tionen auf die VALUES-Klausel ausgedehnt werden und nicht nur in Abhängigkeit einer Subquery-Klausel verwendet werden. Besonders profitieren können zum Beispiel umfangreiche Ladevorgänge in OLTP COMPRESSION PL/SQL-Anwendungen, die mit einer FORALL -Schleife und einem INSERT VALUES -Kommando ausgestattet sind. Folgender Code-Ausschnitt zeigt ein Beispiel der Nutzung: : prod_ids NumList; BEGIN FOR i IN 1..1000 LOOP prod_ids(i) := i; END LOOP; FORALL j IN 200..1000 INSERT /*+ APPEND_VALUES */ INTO comp_tab VALUES (prod_ids(j),sysdate,...); : 2.2 OLTP COMPRESSION (AUCH ADVANCED ROW COMPRESSION) Mit Oracle 11g wurde die Basic-Compression-Methode um ein zweites Verfahren – das OLTP-CompressionVerfahren – erweitert. Mit diesem Verfahren werden nun alle DML-Operationen – auch konventionelle DMLOperationen – sowie ADD und DROP COLUMN-Kommandos unterstützt. Dies bedeutet, dass die Einschränkung auf Bulk-Load-Operationen entfällt und Komprimierung ohne Rücksicht auf die Art der Ladevorgänge garantiert werden kann. Diese neue Komprimierungsmethode wird als 15 16 OLTP COMPRESSION OLTP Compression oder auch als Advanced Row Compression bezeichnet. Hinweis: Dieses Verfahren steht mit der Advanced Compression Option zur Verfügung. Um bei INSERT-Operationen eine möglichst hohe Performance zu erhalten, wird nicht nach jeder Schreiboperation komprimiert, sondern ein neuer Block bleibt so lange unkomprimiert, bis die Daten die PCTFREE-Grenze erreicht haben (siehe Abbildung 2). Abb.2: Komprimierung mit OLTP Compression Empty Block Header Data Uncompressed Block Compressed Block Free Space Teilweise Compressed Block Uncompressed Data Compressed Block Compressed Data OLTP COMPRESSION Hinweis: Tabellen mit OLTP-Compression-Einstellung besitzen den Defaultwert 10 für PCTFREE, wohingegen Tabellen mit Basic Compression als Defaulteinstellung den Wert 0 haben. Die häufig gestellte Frage nach der Höhe der Komprimierungsrate lässt sich nicht allgemein beantworten. Je nach Art der Daten, beispielsweise dem Anteil an redundanten Informationen, der Datenbank-Blockgröße und der Art des Ladevorgangs, können die Komprimierungsraten stark variieren. So ist es mitunter vorteilhaft, eine große Daten­ bank-Blockgröße zu verwenden beziehungsweise mit vorsortierten Daten zu arbeiten, um die Komprimierungsrate zu erhöhen. Tipp aus der Praxis: Um einen Eindruck zu bekommen wie redundant die Daten in den einzelnen Spalten sind, kann die Spalte NUM_DISTINCT aus DBA_TAB_COLUMNS hilfreich sein. NUM_­DISTINCT gibt an, wie viele verschiedene Werte in einer Spalte vorkommen. Setzt man diese Information ins Verhältnis zu der Anzahl der Zeilen, bekommt man einen recht guten Überblick über den Grad der Redundanz. Um eine gute Ratio zu erhalten, sollte die zu komprimierende Tabelle ge­gebenenfalls nach den Spalten mit den höchsten Redundanzen umsortiert werden. 17 18 OLTP COMPRESSION Wie wird Basic Compression oder OLTP Compression eigentlich eingeschaltet? Generell können beide Komprimierungsarten auf Tablespace-, Tabellen- oder Partitionsebene mit dem entsprechendem CREATE- beziehungsweise ALTER-Kommando­ eingeschaltet werden. Da sich die Syntax-­Schlüsselwörter beim CREATE beziehungsweise ALTER TABLE-Kommando mehrfach geändert haben, schadet ein Blick in das aktuelle SQL-Language-Reference-Handbuch nicht. Die folgenden Beispiele geben einen kleinen Überblick dazu. OLTP Compression in 11g Release 1: CREATE TABLE sales_history(…) COMPRESS FOR ALL OPERATIONS; OLTP Compression in 11g Release 2: CREATE TABLE sales_history(…) COMPRESS FOR OLTP; OLTP Compression (auch Advanced Row Compression) in 12c: CREATE TABLE sales_history(…) ROW STORE COMPRESS ADVANCED; Basic Compression (auch Direct Load Compression) in 11g Release 1: CREATE TABLE sales_history(…) COMPRESS FOR DIRECT_LOAD OPERATIONS; OLTP COMPRESSION Basic Compression in 11g Release 2: CREATE TABLE sales_history(…) COMPRESS [BASIC]; Basic Compression in 12c: CREATE TABLE sales_history(…) ROW STORE COMPRESS BASIC; Wie man leicht erkennen kann, folgt die Syntax der Bezeichnung der Algorithmen. Die Syntax ist aufwärtskompatibel, das bedeutet, dass alle Syntaxvarianten in 12c verwendet werden können. Auf Tablespace-Ebene wird mit dem Keyword DEFAULT und der anschließenden Angabe der Komprimierungsart festgelegt, dass alle Tabellen, die in diesen Tablespace geladen werden, der Komprimierungsart des Tablespace folgen. Separate Tabellen- und Partitionsklauseln können dieses Verhalten überschreiben. Das folgende Beispiel zeigt die Default-Tablespace-Einstellung für OLTP-Komprimierung in 11g Release 2. CREATE TABLESPACE ... DEFAULT COMPRESS FOR OLTP; Möchte man im Nachhinein die Inhalte von existierenden unkomprimierten Tabellen in komprimierte Tabellen umwandeln, kann man die Daten mit folgenden Kommandos in einer Einschritt-Operation umschichten und gleichzeitig komprimieren. 19 20 OLTP COMPRESSION ALTER TABLE ... MOVE [TABLE_COMPRESSION_CLAUSE] ALTER TABLE ... MOVE PARTITION|SUBPARTITION COMPRESS [TABLE_COMPRESSION_CLAUSE] Allerdings erfordern diese Kommandos bis einschließlich 11g Release 2 DML-Sperren auf der Tabelle. Falls diese Operationen online ohne Sperren erfolgen sollen, muss man mit dem Package DBMS_REDEFINITION arbeiten. Wer partitions- beziehungsweise subpartitionsweise arbeiten­ kann, kann von der Neuerung in 12c profitieren. Die Syntaxerweiterung ONLINE ermöglicht die Ausführung ohne blockierende DML-Sperren (TM Lock). Gleichzeitige DML-Operationen, die normalerweise in 11g durch die entsprechenden Locks blockiert wären, sind nun möglich. Folgendes Beispiel zeigt, wie in 12c eine Partition ONLINE ohne Sperren in das OLTP-Komprimierungsformat überführt werden kann. ALTER TABLE sales_big MOVE PARTITION sales_q4_2001 ROW STORE COMPRESS ADVANCED ONLINE; Tipp aus der Praxis: Nicht verwechseln sollte man die Operationen ALTER TABLE MOVE COMPRESS mit dem Kommando­ ALTER TABLE ... COMPRESS. Ohne Verwendung des Schlüssel­­­worts MOVE wird nur die sogenannte Table Property­ OLTP COMPRESSION geändert, das heißt es werden Speichereinstellungen für die zukünftige Nutzung definiert. Nur nachträglich eingefügte Zeilen werden komprimiert abgelegt. Bestehende Zeilen werden nicht verändert. Tabellenpartitionen, die USABLE Bitmap-Indizes ent­ halten,­müssen gesondert behandelt werden, falls die Tabelleneigen­schaft von unkomprimiert nach komprimiert geändert werden soll. Dokumentiert ist dieses Verhalten auch im VLDB and Partitioning Guide. Das Vorgehen sieht dabei folgendermaßen aus: 1) Setze Bitmap-Index UNUSABLE. 2) Verändere die Komprimierungseigenschaft der Tabelle. 3) Führe ein REBUILD des Index durch. Missachtet man diese Regeln und wendet beispielsweise ein ALTER TABLE MOVE COMPRESS an, ohne die Indizes vorher UNUSABLE zu setzen, führt dies zu folgender Fehler­ meldung: SQL> alter table part_test move partition part1 compress; alter table part_test move partition part1 compress * ERROR at line 1: 21 22 OLTP COMPRESSION ORA-14646: Specified alter table operation involving compression cannot be performed in the presence of usable bitmap indexes Wie die Fehlermeldung beschreibt, müssen die Indizes zuerst UNUSABLE gesetzt werden; erst dann lässt sich die Operation durchführen. Dieser Vorgang ist deswegen notwendig, da bei komprimierten Tabellensegmenten potenziell mehr Zeilen in einem Datenblock adressiert werden können. Das nachfolgende REBUILD des Index berücksichtigt diese veränderte Sachlage. Diese Regeln gelten übrigens nur für Bitmap-Indizes nicht für B*Indizes. Die Komprimierungseinstellungen der einzelnen­Datenbanktabellen und Partitionen lassen sich über die zu­sätz­lichen Spalten COMPRESSION und COMPRESS_­F OR in DBA_TABLES und DBA_TAB_PARTITIONS beziehungs­weise DBA_TAB_SUBPARTITIONS überprüfen. Für Tablespaces sind dies DEF_ TAB_COMPRESSION und COMPRESS_FOR . SELECT table_name, compression, compress_for FROM user_tables; TABLE_NAME COMPRESS COMPRESS_FOR ----------------------- -------- -----------MY_CUSTOMERS_CPR ENABLED BASIC ACO_CUSTOMERS ENABLED OLTP ... Hybrid Columnar Compression (HCC) Bis Oracle 11g ist zu bachten, dass Tabellen mit mehr als 255 Spalten, Index-Organized Tables, External Tables und Cluster Tables nicht komprimiert werden können. In 12c wurde die Spaltengrenze von 255 für Tabellen mit Advanced Row Compression allerdings aufgehoben. Im aktuellen Handbuch Oracle Database SQL Language Reference kann man die entsprechenden Einschränkungen nachlesen. Statements, die zu Row Chaining führen, können unter Umständen zu einer Vergrößerung der Tabelle führen. Die Master Note für OLTP Compression (Doc ID 1223705.1) gibt Aufschluss über den aktuellen Stand der Dinge und auf gegebenenfalls zu installierende Patches. Der Einsatz von Komprimierung kann nicht nur zur Speicher­ reduktion, sondern auch zu einem Performancegewinn ­führen. Der Buffer Cache kann besser ausgenutzt werden, I/O intensive Operationen können somit beschleunigt werden. Allerdings kann es bei DML-Operationen auch zu höheren Redo- beziehungsweise CPU-Anforderungen kommen. In jedem Fall sollten vor dem Einsatz in der Praxis entsprechende Tests durchgeführt werden. 2.3 HYBRID COLUMNAR COMPRESSION (HCC) Der Einsatz spezieller Storage wie Exadata-Storage-Systeme,­ Sun ZFS Storage Appliance (Oracle NAS Storage) oder 23 24 Hybrid Columnar Compression (HCC) Axiom­Storage (Oracle SAN Storage) ermöglicht die Verwendung von weiteren Komprimierungsalgorithmen, die unter dem Begriff Hybrid Columnar Compression zusammengefasst werden. Die Non-Exadata Storage-Systeme (ZFS und Pillar Storage) erfordern dabei eine Datenbankversion ab 11.2.0.3. Oracle verwendet bei HCC eine Kombination aus zeilenund spaltenbasierter Speicherung und die Verwendung von speziellen Komprimierungsalgorithmen. Die Datensätze werden in logische Compression-Einheiten (Logical Compression Unit) (siehe Abbildung 3) aufgeteilt und innerhalb einer Einheit nach Spalten sortiert und danach komprimiert. Die Spaltenwerte einer Gruppe werden dann im selben Datenblock abgespeichert. Auf diese Art und Weise kann eine sehr effiziente Komprimierung erfolgen, und es können hohe Komprimierungsraten – höher als im Fall von BASIC und OLTP Compression – erreicht werden. Abb.3: Logical Compression Unit Logical Compression Unit (CU) BLOCK HEADER BLOCK HEADER BLOCK HEADER BLOCK HEADER CU HEADER C1 C2 C3 C4 C5 C5 C6 C7 C8 Hybrid Columnar Compression (HCC) Vorgesehen sind diese Verfahren nur für Daten, die nicht häufig verändert werden. Sie sind – wie bei der BASIC Compression – ausschließlich für Bulk Loads implementiert. Innerhalb von HCC gibt es unterschiedliche Komprimierungsverfahren. Diese können durch die Schlüsselwörter ARCHIVE und QUERY mit dem Zusatz LOW beziehungsweise HIGH angezeigt werden. Bei typischer Warehouse-Verwendung mit Low Concurrency empfiehlt sich der Einsatz von QUERY . Wie das Schlüsselwort ARCHIVE schon anzeigt, sollten Daten, die nicht mehr verändert werden und für eine Langzeitspeicherung vorgesehen sind, mit ARCHIVE HIGH gespeichert werden. Die Komprimierungsverfahren unterscheiden sich intern in der Verwendung unterschied­licher Compression-Algorithmen und unterschiedlich großer Logical Compression Units. Folgende Beispiele zeigen die Verwendung der Syntax. Auch hier, wie bei der BASIC und OLTP Compression, hat sich die Syntax in 12c verändert. HCC mit Query (Default ist HIGH) 11g Release 2: CREATE TABLE mass(...) COMPRESS FOR QUERY [LOW|HIGH] HCC mit Query (Default ist HIGH) 12c: CREATE TABLE mass(...) COLUMN STORE COMPRESS FOR QUERY[LOW|HIGH] 25 26 INDEX-KOMPRIMIERUNG HCC mit Archive (Default ist LOW) 11g Release 2: CREATE TABLE mass(...) COMPRESS FOR ARCHIVE [LOW|HIGH] HCC mit Archive (Default ist LOW) 12c: CREATE TABLE mass(...) COLUMN STORE COMPRESS FOR ARCHIVE[LOW|HIGH] Wie zu erwarten, ist die Compression-Ratio bei der Verwendung von ARCHIVE höher als bei QUERY . Tipp aus der Praxis: Um einen flexiblen Einsatz der Kompri­ mierungsarten zu gewährleisten, werden in der Praxis häufig unterschiedliche Algorithmen für unterschiedliche Partitionen verwendet. Am Ende dieses Kapitels soll noch auf die neuen ILM Features in 12c hingewiesen werden, die je nach Art der Verwendung der Daten eine automatische Komprimierung und/oder Verlagerung der Daten pro Partition oder Tabelle ermöglicht (siehe Informationen in Kapitel 6). 3 Index-Komprimierung Eine Komprimierung im Index wird automatisch bei Bitmap-­ Indizes angewendet, die speziell in Warehouse-Anwendungen bei Spalten mit geringer Kardinalität zum Einsatz kommen. INDEX-KOMPRIMIERUNG Bitmap-Indizes speichern eine Bitmap für jeden IndexSchlüssel statt einer Liste von ROWIDS. Jedes Bit in dieser Bitmap adressiert eine ROWID und somit eine Zeile in der Tabelle. Bitmap-Indizes benötigen keine Komprimierungsalgorithmen, da diese Art von Indizes einen sehr geringen Speicherbedarf hat. Wegen des speziellen Locking-Verhaltens bietet die Verwendung von Bitmap-Indizes besonders bei lesenden Zugriffen Vorteile. Weniger bekannt ist die Tatsache, dass auch „normale“ B*Tree-Indizes komprimiert werden können. Im Gegensatz zum Bitmap-Index ist kein spezielles Locking erforderlich, sodass diese ohne Einschränkung im OLTP-Umfeld für unterschiedliche Anwendungen, so zum Beispiel auch im ERP-Bereich, eingesetzt werden können. Die sogenannte Index Key Compression ist bereits seit Oracle 9i verfügbar und steht für B*Tree-Indizes und IOTs (Index Organized Tables) zur Verfügung. Das Prinzip der Index Key Compression beruht dabei auf der Eliminierung von sich wiederholenden Schlüsselwerten (auch Präfix genannt) eines nonunique single column- oder eines unique multicolumn-Index. Zusammengesetzte Schlüssel (unique multicolumn) werden dabei in einen Präfix- und einen Suffix-Anteil unterteilt, wobei der Suffix-Anteil den eindeutigen Teil des Index-Schlüssels repräsentiert. 27 28 INDEX-KOMPRIMIERUNG Wenn sich Schlüsselwerte im Präfix-Anteil des Index wiederholen, werden diese Werte nur einmal gespeichert und vom Suffix referenziert. Bei „nonunique single column“-Schlüssel wird die ROWID-Information genutzt, um den Schlüssel eindeutig zu machen. Der Präfix-Anteil wird also durch die sich wiederholenden Werte repräsentiert; der verbleibende Anteil, die ROWIDS, stellen dann den Suffix-Anteil dar. Präfix- und Suffix-Werte befinden sich grundsätzlich im gleichen Block. Diese Speicherung kann zu einer starken Reduzierung der Index Leaf Pages und damit der Anzahl der I/O-Operationen bei einem Indexzugriff führen. Die Komprimierung wird beim Erzeugen des Index (CREATE INDEX ) oder mit einem ALTER INDEX REBUILD -Kommando eingestellt. Bei IOTs wird das CREATE TABLE beziehungsweise das ALTER TABLE MOVE Kommando verwendet. CREATE INDEX i_name ON t1(col1,col2,col3,col4) COMPRESS 2; ALTER INDEX i_name REBUILD [ONLINE] COMPRESS 1; Die Klauseln COMPRESS 2 und COMPRESS 1 geben dabei die Anzahl der Präfixspalten an. Die Default-Präfixlänge für unique Indizes ist die Anzahl der Spalten minus 1, für nonunique Indizes beträgt dieser Wert die Anzahl der Spalten. Index-Komprimierung lässt sich über die Standard Views wie USER_INDEXES monitoren. 29 INDEX-KOMPRIMIERUNG SELECT index_name, owner, compression, prefix_length FROM dba_indexes WHERE PREFIX_LENGTH is not null AND owner='US'; INDEX_NAME OWNER COMPRESS PREFIX_LENGTH ---------------------- ---------- -------- ------------DR$TEXT_IDX$X US ENABLED 2 DR$TESTIDX$X US ENABLED 2 DR$MYTABLE_OTXML$X US ENABLED 2 DR$FILTER_TEST_IDX$X US ENABLED 2 DR$IDX_KOMMENTARE$X US ENABLED 2 CT_COMP US ENABLED 1 Wie findet man nun die optimale Komprimierung und Präfixlänge? Zur Illustration werden folgende Index-LeafEinträge mit den zugehörigen ROWIDS betrachtet: Arzt Zahnarzt AAAPvCAAFAAAAFaAAa Restaurant Italienisch AAAPvCAAFAAAAFaAAa Arzt Internist AAAPvCAAFAAAAFaAAl Restaurant Bayerisch AAAPvCAAFAAAAFaAAm Restaurant Indisch AAAPvCAAFAAAAFaAAq Der Index wird nun mit der Klausel COMPRESS 1 gespeichert. Die Schlüsselwerte „Restaurant“ (hier P 0) und „Arzt“ (hier P 1) werden im Leaf-Block genau einmal abgespeichert. 30 INDEX-KOMPRIMIERUNG Folgende Tabelle zeigt das Ergebnis dieser Speicherung in einer schematischen Darstellung. P 0 Restaurant P 1 Arzt P 0 Italienisch AAAPvCAAFAAAAFaAAa P 0 Bayerisch AAAPvCAAFAAAAFaAAm P 0 Indisch AAAPvCAAFAAAAFaAAq P 1 Zahnarzt AAAPvCAAFAAAAFaAAa P 1 Internist AAAPvCAAFAAAAFaAAl Die Güte der Komprimierungsrate kann stark variieren und ist zum Beispiel abhängig von der richtigen Anzahl der kom­primierten Spalten, den Werteausprägungen und der Anordnung der Spalten im Index. Falls das Umsortieren der Spalten im Index möglich ist, kann dies zu höheren Komprimierungsraten führen. Um zu beurteilen, ob und welche Indexkomprimierung für die entsprechenden Indexkandidaten sinnvoll ist, kann das Kommando ANALYZE INDEX hilfreich sein. ALTER INDEX ba_kat_ort VALIDATE STRUCTURE; 31 INDEX-KOMPRIMIERUNG Bei der Ausführung wird der Index analysiert und das Ergebnis in der dynamischen Tabelle INDEX_STATS eingetragen. Die Spalte OPT_CMPR_COUNT gibt die optimale KeyCompression-Länge an, OPT_CMPR_PCTSAVE die Speichereinsparung in Prozent. Die folgende Abfrage zeigt das Ergebnis aus der INDEX_ STATS -Tabelle nach Anwendung des ANALYZE INDEX Kommandos – angewendet auf einen unkomprimierten Index. SELECT name, blocks, br_blks, lf_blks, opt_cmpr_pctsave, opt_cmpr_count FROM index_stats; NAME BLOCKS BR_BLKS LF_BLKS OPT_CMPR_PCTSAVE OPT_CMPR_COUNT --------- ------- -------- --------- ----------------- -------------BA_KAT_ORT 768 3 643 46 2 Die Komprimierung des Index mit COMPRESS 2 würde eine Einsparung von 46 Prozent des Speicherplatzes bewirken. In einem zweiten Test wird der Index mit COMPRESS 2 aufgebaut. Das Ergebnis in der Tabelle INDEX_STATS zeigt nun, dass es kein weiteres Einsparungspotenzial gibt. Die Blockanzahl hat sich – wie zu erwarten war – fast halbiert. SELECT name, blocks, br_blks, lf_blks, opt_cmpr_pctsave, opt_cmpr_count 32 TABELLEN MIT UNSTRUKTURIERTEN DATEN FROM index_stats; NAME BLOCKS BR_BLKS LF_BLKS OPT_CMPR_PCTSAVE OPT_CMPR_COUNT --------- ------- -------- --------- ----------------- -------------BA_KAT_ORT 384 1 345 0 2 Die Tabelle INDEX_STATS ist dynamisch und speichert nur den letzten Eintrag des ANALYZE INDEX -Kommandos. Um eine Historie zu speichern, sollte man eine Hilfstabelle anlegen und diese mit den entsprechenden Ergebnissen füllen. Ein Nachteil dieser Methode ist, dass das ANALYZE INDEX -Kommando weder ONLINE noch PARALLEL durchführbar ist. Wichtiger Hinweis: Da bei der Ausführung ein DML Lock erfolgt, können DML-Operationen besonders bei der Verwendung von großen Indizes stark beeinträchtigt werden. Ein alternatives Skript zur Indexanalyse liefert die MOS Note 989186.1. Allerdings wird hier keine Analyse über die optimale KeyCompression-Länge durchgeführt. 4 Tabellen mit unstrukturierten Daten Unstrukturierte Daten vom Datentyp XML, CLOB und BLOB sind in der Regel sehr speicherintensiv. Aus diesem Grund ist eine Komprimierung dieser Daten sinnvoll. Mit Oracle Database 11g steht ein neuer Datentyp für die Speicherung von Large Objects in allen Editionen der Datenbank zur Verfügung, die sogenannten SecureFiles. Im Gegensatz zur „alten“ LOB-Technologie, die ab TABELLEN MIT UNSTRUKTURIERTEN DATEN 11g mit dem neuen Schlüsselwort BASICFILE – im Gegensatz zu SECUREFILE für die neue SecureFile-Speicherung – definiert werden kann, bieten SecureFiles verbesserte Performance, vereinfachtes Management und erweiterte Funktionen unter Nutzung von zusätzlichen Daten­bankOptionen. Der Initialisierungsparameter DB_­SECUREFILE mit den Werten PERMITTED, NEVER, FORCE, ALWAYS und IGNORE steuert dabei die Verwendung. In 11g ist der Default PERMITTED – also erlaubt – in 12c hingegen PREFERRED – also Verwendung von SecureFiles, falls nichts anderes spezifiziert wurde. Eine Eigenschaft von Oracle SecureFiles ist die Möglichkeit, Komprimierung einzuschalten. Dies erfordert allerdings den Einsatz der Advanced Compression Option. Dabei sind folgende Einstellungen bei der Komprimierung möglich: D EDUPLICATE : LOBs mit identischem Inhalt werden phy• sikalisch nur einmalig gespeichert. Diese Einstellung ist besonders sinnvoll bei der Nutzung von großen LOBs, die mehrfach gespeichert werden wie beispielsweise E-MailAttachments. C OMPRESS HIGH (beziehungsweise MEDIUM, LOW): Redu• zierung des Speicherbedarfs von LOBs durch Komprimierung. Diese Komprimierung wird durch einen Standard­ algorithmus durchgeführt und kann wahlweise mit einer 33 34 TABELLEN MIT UNSTRUKTURIERTEN DATEN hohen, mittleren oder niedrigen Komprimierungsrate durchgeführt werden. Die LOB-Komprimierung mit Para­­­metereinstellung HIGH hat dabei einen höheren CPU-­­ Bedarf als die Komprimierung der LOBs mit der SecureFile­­ Standardkomprimierung MEDIUM oder mit der Komprimierung LOW . Die LOB-Komprimierung ist unabhängig von der Tabellenkomprimierung und wird beim CREATE TABLE oder ALTER TABLE separat über die SecureFile LOB-Storage-Klausel angegeben. CREATE TABLE nachrichten_text (dok_id NUMBER,...,text_info CLOB) LOB (text_info) STORE AS SECUREFILE(DEDUPLICATE COMPRESS HIGH DISABLE STORAGE IN ROW) Folgende Abfrage gibt Aufschluss über die Speicherung der LOBs. SELECT table_name, column_name, compression, deduplication, in_row FROM user_lobs WHERE securefile='YES'; TABLE_NAME COLUMN_NAME COMPRE DEDUPLICATION IN_ ------------------ --------------- ------ --------------- --DR$FT_NAMES1$I TOKEN_INFO NO NO YES DR$FT_NAMES1$R DATA NO NO YES NACHRICHTEN_TEXT TEXT_INFO HIGH LOB NO ... TABELLEN MIT UNSTRUKTURIERTEN DATEN Unabhängig von der Komprimierung sollte man auch Überlegungen zur generellen LOB-Speicherung anstellen – beispielsweise zur in-line- beziehungsweise out-of-lineSpeicherung der LOBs. Der Default ist in-line Speicherung (ENABLE STORAGE IN ROW). Das bedeutet LOBs, die kleiner als 4000 Bytes sind, werden im Tabellensegment selbst gespeichert; größere LOBs hingegen in einem zusätzlichen LOB-Segment. Manchmal kann diese „gemischte“ Speicherung allerdings von Nachteil beim Zugriff sein. In diesen Fällen ist die out-of-line-Speicherung (DISABLE STORAGE IN ROW) – alle LOBs in einem zusätzlichen Segment zu speichern – vorzuziehen und kann sogar zu großen Performancesteigerungen führen. Je nach gespeichertem Format (HTML, Text, ASCII, PDF, GIF usw.) sind die Komprimierungsraten unterschiedlich. Zweistellige Werte bei der Komprimierungsrate können dabei allerdings nichts Ungewöhnliches sein. Speziell bei I/O-intensiven Applikationen kann der Einsatz von Komprimierung von Vorteil sein. Ein Beispiel dafür liefert die 11g-Installation bei der FIZ CHEMIE in Berlin, die eine Performancesteigerung sowie zusätzliche Speicherplatzeinsparung erreichen konnte. Dabei wurde mittels einer Mark­ up-Abfrage, die summarisch betrachtet das ressourcenintensivste Statement der getesteten Anwendung darstellt, das Laufzeitverhalten anhand einer Tabelle mit ca. 200000 35 36 TABELLEN MIT UNSTRUKTURIERTEN DATEN Zeilen analysiert. Allein durch Einsatz der I/O-optimierten SecureFiles wurde bereits eine Performancesteigerung von 30 Prozent erzielt. In Verbindung mit Advanced Compression ergab die Testreihe dann eine radikale Verbesserung der Laufzeit. Diese wurde von ursprünglich 59 Minuten auf 12 Minuten reduziert – und das bei einer gleichzeitigen Verringerung des Speicherplatzes auf 25 Prozent des ursprünglichen Speicherbedarfs. Andere Beispiele des Einsatzes sind Daten aus dem SPATIAL-Bereich. Auch hier kann die Komprimierung zu großen Speichereinsparungen führen. Umgekehrt macht es keinen oder wenig Sinn, schon vorkomprimierte Formate zu komprimieren. Folgende Übersicht gibt einen Überblick über die möglichen Kompres­ sionsraten bei Verwendung unterschiedlicher Formate. Abb.4: Mögliche Compression Ratio bei Nutzung unterschiedlicher Formate 90 Compression Ratio (%) 80 70 60 50 40 30 Compress Medium 20 Compress High 10 Compress Low DOC DOCX HTML JPG PDF PPT Files from OFO PS TIF XLS TABELLEN MIT UNSTRUKTURIERTEN DATEN Um eine gute Komprimierungsrate zu erzielen, ist die richtige­ Wahl der Blockgröße entscheidend. Bei Large Objects lassen sich mithilfe der GETLENGTH -Funktion unkomprimierte LOB-Größen abfragen. Handelt es sich bei den Daten nicht schon um stark komprimierte Formate wie beispielsweise das GIF-Format, kann eine Halbierung der durchschnittlichen LOB-Größe die ideale Blockgröße für die komprimierten Lobs darstellen. Um die Ratio zu evaluieren, kann man entweder USER_­ (siehe Beispiel) für die komprimierte beziehungsweise unkomprimierte Version der Tabelle abfragen oder eine blockgenaue detaillierte Speicheraufteilung mit dem Package DBMS_SPACE berechnen. SEGMENTS SELECT bytes/(1024*1024) groesse FROM user_segments WHERE segment_name='SECURE_TABLE' UNION SELECT bytes/(1024*1024) FROM user_segments WHERE segment_name IN (SELECT segment_name FROM user_lobs WHERE table_name='SECURE_ TABLE') GROESSE ---------34 3463 37 38 TABELLEN MIT UNSTRUKTURIERTEN DATEN SELECT bytes/(1024*1024) groesse FROM user_segments WHERE segment_name='COMPRESS_TABLE' UNION SELECT bytes/(1024*1024) FROM user_segments WHERE segment_name IN (SELECT segment_name FROM user_lobs WHERE table_name='COMPRESS_ TABLE'); GROESSE --------19 472.25 Tipp aus der Praxis: Hat man vorab die Möglichkeit, auf die Daten mit dem zip-Kommando zuzugreifen, kann man sich schon einen ungefähren Eindruck von der möglichen Komprimierungsrate verschaffen. In 12c bietet der Compression Advisor zusätzliche Möglichkeiten im Voraus zu prüfen, welche Kompressionsraten bei LOB Compression zu erwarten sind. Wie migriert man nun diesen Datentyp? Da kein ALTER zur Migration zur Verfügung steht, bietet sich entweder eine Online-Migration mit dem Paket DBMS_REDEFINITION oder eine Neuanlage der Tabelle und Kopie der Daten an. TABLE MODIFY -Kommando COMPRESSION ADVISOR Nicht ganz unerwähnt soll das Package UTL_COMPRESS bleiben, das mit Oracle Version 10g eingeführt wurde. Mit UTL_COMPRESS lassen sich RAW, BLOB oder BFILEDaten komprimieren beziehungsweise dekomprimieren. Das Resultat von UTL_COMPRESS entspricht dabei dem der Werkzeuge compress in Unix-Umgebungen und zip in Windows-­Umgebungen. UTL_COMPRESS erfordert allerdings im Unterschied zur automatischen Komprimierung und Dekomprimierung der SecureFile LOBs eine vollständige Programmierung in PL/SQL für die Komprimierung und die Dekomprimierung der Daten und ist unabhängig von der Speicherung in der Datenbank. Ausführliche Beispiele dazu finden sich in der MOS Note 249974.1. 5 Compression Advisor 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 Compression Advisors. Seit Oracle­Database 11g Release 2 steht standardmäßig der Compression Advisor in der Datenbank zur Verfügung. Ohne zusätzliche Installation ist dieser ­Advisor über das 39 40 COMPRESSION ADVISOR Package DBMS_COMPRESSION in jeder Edition­sofort ein­ setzbar. Hat man allerdings noch keinen Zugriff auf eine 11gRelease-2-Installation, kann man Unterstützung durch eine zusätzliche Package-Installation erhalten. Download und Nutzungsbeschreibung dazu finden sich auf OTN (siehe Punkt 12: Weitere Informationen). Im Unterschied zur 11gRelease-2-Funktionalität muss man bei der Nutzung mit einigen Einschränkungen rechnen. So ist dieses Package beispielsweise nicht für partitionierte Tabellen geeignet. Außerdem werden nicht alle Komprimierungsalgorithmen unterstützt. Im Gegensatz zum „alten“ Compression Advisor ist der Compression Advisor in 11g Release 2 auch für partitionierte Tabellen und für alle vorhandenen Komprimierungsalgorithmen (auch HCC) einsetzbar. Eine grafische Implementierung existiert allerdings noch nicht, sodass man sich mit der Syntax auseinandersetzen muss. Für partitionierte Tabellen bedeutet dies übrigens, dass man pro Partitionssegment eine Berechnung durchführen muss. Folgende Fragestellungen können mit DBMS_COMPRESSION gelöst werden. COMPRESSION ADVISOR •Sind alle Blöcke meiner Tabellen komprimiert? Und welcher Komprimierungstyp wurde verwendet? Die Antwort liefert die Prozedur GET_COMPRESSION_TYPE . Über die einfache Eingabe einer ROWID kann der Advisor ermitteln, ob und welche Komprimierung verwendet wurde. •Welche Komprimierung (Ratio) kann beim Einsatz der unterschiedlichen Komprimierungstypen erwartet werden? Hier kann die Prozedur GET_COMPRESSION_RATIO weiterhelfen. Nach Eingabe einer Komprimierungsart wird die Ratio des Segments ermittelt. Zusätzlich zu den Komprimierungstypen OLTP und BASIC können auch HCC-Komprimierungstypen wie QUERY LOW, QUERY HIGH, ARCHIVE LOW und ARCHIVE HIGH ohne Zugriff auf ein Exadata-Storagesystem getestet werden. Auch Indizes und unstrukturierte Daten nehmen einen Anteil am gesamten Speicherplatz ein und sollten in die Berechnung einfließen. Der Compression Advisor liefert dazu allerdings keine Unterstützung in 11g Release 2. Erst ab 12c gibt es eine Erweiterung für unstrukturierte Daten. Realisierte Compression-Projekte zeigen übrigens, dass die Berechnung der Ratio durch den Compression Advisor sehr realistische Werte und Annäherungen zur tatsächlichen Speicherung liefert. 41 42 Bestimmung der Compression Ratio 5.1 BESTIMMUNG DER COMPRESSION R ATIO Im ersten Fall soll die Compression Ratio in 11g Release 2­ bestimmt werden. Der Aufruf der Prozedur GET_ COMPRESSION_­R ATIO benötigt einige IN-Parameter und liefert das Ergebnis über die vorgegebenen OUT-Parameter. Der Parameter COMPTYPE kann dabei als Package-Konstante oder als Zahl (siehe Abbildung 5) angegeben werden. Abb.5: Komprimierungstypen und Konstanten in 11g Release 2 Constant Type Value Description COMP_NOCOMPRESS NUMBER 1 No compression COMP_FOR_OLTP NUMBER 2 OLTP compression COMP_FOR_QUERY_HIGH NUMBER 4 High compression level COMP_FOR_QUERY_LOW NUMBER 8 Low compression level COMP_FOR_ARCHIVE_HIGH NUMBER 16 High compression level COMP_FOR_ARCHIVE_LOW NUMBER 32 Low compression level for query operations for query operations for archive operations for archive operations Der zu überprüfende Komprimierungstyp entspricht im nächsten Beispiel der OLTP-Komprimierung (siehe Wert 2). Bestimmung der Compression Ratio Besitzt die Tabelle Partitionen, muss die Ratio pro Partition berechnet werden. In folgendem Beispiel wird die Partition COSTS_Q1_1998 der Tabelle COSTS des Users SH überprüft. Möchte man die Ratio für alle Partitionen einer Tabelle berechnen, kann dies über eine Programmerweiterung in PL/SQL erreicht werden. Hinweis: Damit die Durchführung funktioniert, müssen als Voraussetzung ausreichende Zugriffsrechte und Platz im Tablespace SCRATCHTBSNAME bereitgestellt werden. Am Besten führt man die Prozedur daher mit einem User aus, der DBA-Privilegien besitzt. (Beachten Sie bitte die Securityvorgaben in Ihrem Unternehmen.) set serveroutput on declare b_cmp PLS_INTEGER; b_uncmp PLS_INTEGER; row_cmp PLS_INTEGER; row_uncmp cmp_ratio cmp_str PLS_INTEGER; NUMBER; VARCHAR2(200); begin DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( SCRATCHTBSNAME => 'USERS', OWNNAME => 'SH', 43 44 Bestimmung der Compression Ratio TABNAME => 'COSTS', PARTNAME => 'COSTS_Q1_1998', COMPTYPE => 2, BLKCNT_CMP => b_cmp, BLKCNT_UNCMP ROW_CMP => b_uncmp, => row_cmp, ROW_UNCMP => row_uncmp, CMP_RATIO => cmp_ratio, COMPTYPE_STR => cmp_str); dbms_output.put_line('# Blocks compressed dbms_output.put_line('# Blocks uncompressed dbms_output.put_line('Ratio => '|| b_cmp); => '|| b_uncmp); => '|| 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. Ein Blick auf Abbildung 5 zeigt, dass auch Hybrid Columnar Compression (HCC) mit dem Compression Advisor überprüft werden kann. Der Test ist möglich, ohne ein entsprechendes Bestimmung der Compression Ratio Storagesystem zu besitzen, und ab Version 11.2.0.2 auch ohne zusätzliche Installation von Patches. Eine Tabelle kann also ohne weiteren Aufwand auf das Einsparungspotenzial von vier weiteren Komprimierungstypen überprüft werden. Hinweis: Die Größe der Tabelle sollte für den Test mit HCC Komprimierung geeignet sein und mindestens 1000000 Zeilen enthalten. Wie funktioniert die Berechnung der Ratio? Generell werden zwei temporäre Tabellen im Tablespace erstellt, der über den Parameter SCRATCHTBSNAME benannt wird. Die eine Tabelle enthält ein Stichprobe aus komprimierten Blöcken die andere aus unkomprimierten Blöcken. Nach der Berechnung der Ratio werden diese beiden Tabellen wieder automatisch gelöscht. Um die Verwendung der Ressourcen zu begrenzen, ist bei der HCC-Komprimierung übrigens die Anzahl der verwendeten Zeilen für das Sampling auf 1 000 000 Zeilen limitiert. In 12c gibt es einige Veränderungen an DBMS_COMPRESSION. Beispielsweise wurden Parameter wie TABNAME und PARTNAME in OBJNAME und SUBOBJNAME umbenannt und die Liste der Konstanten erweitert (siehe Abbildung 6). 45 46 Bestimmung der Compression Ratio Abb.6: Komprimierungstypen und Konstanten in 12c Constant Type Value Description COMP_NOCOMPRESS NUMBER 1 No compression COMP_ADVANCED NUMBER 2 Advanced compression level COMP_QUERY_HIGH NUMBER 4 High compression level for query operations COMP_QUERY_LOW NUMBER 8 Low compression level for query operations COMP_ARCHIVE_HIGH NUMBER 16 High compression level for archive operations COMP_ARCHIVE_LOW NUMBER 32 Low compression level for archive operations COMP_BLOCK NUMBER 64 Compressed row COMP_LOB_HIGH NUMBER 128 High compression level for LOB operations COMP_LOB_MEDIUM NUMBER 256 Medium compression level for LOB operations COMP_LOB_LOW NUMBER 512 Low compression level for LOB operations COMP_RATIO_LOB_MINROWS NUMBER 1000 Minimum required number of LOBs in the object for which LOB compression ratio is to be estimated COMP_BASIC NUMBER 4096 Basic compression level COMP_RATIO_LOB_MAXROWS NUMBER 5000 Maximum number of LOBs used to compute the LOB compression ratio Bestimmung der Compression Ratio COMP_RATIO_MINROWS NUMBER 1000000 Minimum required number of rows in the object for which HCC ratio is to be estimated COMP_RATIO_ALLROWS NUMBER -1 To indicate the use of all the rows in the object to estimate HCC ratio OBJTYPE_TABLE PLS_ INTEGER 1 Identifies the object whose compression ratio is estimated as of type table Das Aufruf von DBMS_COMPRESSION sieht in 12c dann folgendermaßen aus: ... DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( SCRATCHTBSNAME OWNNAME => 'USERS', => 'SH', OBJNAME => 'COSTS', SUBOBJNAME => 'COSTS_Q1_1998', COMPTYPE => 2, BLKCNT_CMP => b_cmp, BLKCNT_UNCMP => b_uncmp, ROW_CMP => row_cmp, ROW_UNCMP => row_uncmp, CMP_RATIO => cmp_ratio, COMPTYPE_STR => cmp_str); ... 47 48 Bestimmung der Compression Ratio Neu in 12c ist der Einsatz für unstrukturierte Daten. Laut Abbildung 5 können dabei die Level LOW (512), MEDIUM (256)und HIGH (128) für SecureFile komprimierte Daten überprüft werden. Das folgende Beispiel zeigt eine mögliche Implementierung. Mit COMPTYPE 128 wird der Compression Level HIGH überprüft; die LOBs im Beispiel sind in der Spalte TEXT gespeichert. set serveroutput on declare b_cmp PLS_INTEGER; b_uncmp PLS_INTEGER; lob_cnt PLS_INTEGER; cmp_ratio NUMBER; cmp_str VARCHAR2(200); begin DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( SCRATCHTBSNAME => 'USERS', TABOWNER => 'SH', TABNAME => 'BASIC_LOB', LOBNAME => 'TEXT', PARTNAME => '', COMPTYPE => 128, BLKCNT_CMP => b_cmp, Bestimmung des Komprimierungstyps BLKCNT_UNCMP => b_uncmp, LOBCNT => lob_cnt, CMP_RATIO => cmp_ratio, COMPTYPE_STR => cmp_str); end; / Sampling percent: 2.5 Uncomp blocks: 1246 Comp blocks: 638 Number of lobs sampled: 4980 compression ratio: 1.9 PL/SQL procedure successfully completed. Von den ungefähr 200 000 gespeicherten LOBs der Tabelle BASIC_LOB wurden ca. 5000 LOBs überprüft. Die Ratio ist circa 2. 5.2 BESTIMMUNG DES KOMPRIMIERUNGSTYPS Mithilfe der Funktion GET_COMPRESSION_TYPE kann sogar im Nachhinein der Komprimierungstyp einer 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. 49 50 Rückrechnen von komprimierten Daten 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 SELECT dbms_compression.get_compression_type('SH','SALES','AAAR+EAAFAAAAzDAED') typ FROM dual; TYP ---------2 Der Wert 2 entspricht der OLTP Komprimierung. 5.3 RÜCKRECHNEN VON KOMPRIMIERTEN DATEN Nun stellt sich die Frage, ob man diese Berechnung auch dazu verwenden kann, eine Rückrechnung durchzuführen? Das heißt, man gibt ein komprimiertes Segment vor und möchte berechnen, wie groß das unkomprimierte Segment war oder – bei Rückrechnen von komprimierten Daten dauerndem Verzicht auf die Komprimierung – wie groß das Segment werden würde. Auch dies kann mit der Prozedur GET_COMPRESSION_RATIO bewerkstelligt werden, indem man als Eingabewert den aktuellen Komprimierungstyp angibt. Da immer eine unkomprimierte Version berechnet und ausgegeben wird, können wir auf diese Weise die ursprüngliche Segmentgröße abschätzen. Dies wird im Folgenden kurz demonstriert. Als Beispiel dient die Tabelle CUSTOMERS_BIG, die unkomprimiert vorliegt. Um eine Kontrolle über die Güte des Ergebnisses zu haben, wird die Segmentgröße vor der Komprimierung abgefragt. SELECT segment_name, bytes/1024/1024, blocks FROM user_segments WHERE segment_name='CUSTOMERS_BIG'; SEGMENT_NAME BYTES/1024/1024 BLOCKS -------------------- --------------- ---------CUSTOMERS_BIG 24 3072 Danach wird eine OLTP-Komprimierung durchgeführt und die Segmentgröße nach der Komprimierung überprüft. ALTER TABLE customers_big MOVE COMPRESS FOR oltp; SELECT segment_name, bytes/1024/1024, blocks FROM user_segments WHERE segment_name='CUSTOMERS_BIG'; 51 52 Rückrechnen von komprimierten Daten SEGMENT_NAME BYTES/1024/1024 BLOCKS -------------------- --------------- ---------CUSTOMERS_BIG 13 1664 Im nächsten Schritt führen wir die Rückrechnung mithilfe des Compression Advisors durch. Der Parameter COMPTYPE­erhält den Wert DBMS_COMPRESSION .COMP_FOR_ OLTP – dies entspricht der OLTP-Komprimierung, die wir auf die Tabelle angewendet haben. Statt der Konstanten DBMS_COMPRESSION .­C OMP_FOR_OLTP kann natürlich auch die Funktion DBMS_COMPRESSION .GET_COMPRESSION_TYPE verwendet werden. 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 =>'CUSTOMERS_BIG', 53 Rückrechnen von komprimierten Daten PARTNAME =>'', 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('Compression-Typ => '|| cmp_str); end; / # Blocks compressed => 1529 # Blocks uncompressed => 2877 Ratio => 1.8 Compression-Typ => "Compress For OLTP" Wir erhalten als Ergebnis für die unkomprimierte Tabelle (siehe „Blocks uncompressed“) 2877 Blöcke. Das Resultat entspricht zwar nicht zu 100 Prozent der ursprünglichen Größe, kann aber eine gute Hilfestellung bei einer Abschätzung liefern. 54 INFORMATION LIFECYCLE MANAGEMENT 6 Information Lifecycle Management Information Lifecycle Management (kurz ILM) ist kein neues Schlagwort, sondern ein gängiger Begriff um den „Lebenszyklus“ von Daten zu beschreiben. ILM hat zum Ziel, die Speicherung von Informationen entsprechend ihrem Wert und ihrer Nutzung optimal auf dem jeweils kostengünstigsten Speichermedium – im besten Fall automatisch – zu platzieren; so die Definitionen im Web. Die Techniken zur Realisierung von ILM wie Partitionierung, Speicherplatzeinsparung durch Komprimierung, Verlagerung von Daten und Virtual Private Database (kurz VPD) für die unterschiedlichen Sichtweisen auf die Daten sind schon lange Bestandteil der Oracle-Datenbank und werden mit jedem Release weiterentwickelt. Allerdings musste eine Automatisierung bisher über eigene Programme oder spezielle Werkzeuge implementiert werden, nachdem die Daten vorab manuell kategorisiert worden sind. Neu in Oracle Database 12c ist nun die vollständige Integration von ILM Features in die Datenbank. Keine zusätzlichen Werkzeuge oder Skripte zur Implementierung sind notwendig. Wichtige Voraussetzung für die Verwendung dieser neuen Technologie ist die Lizenzierung der Advanced Compression­ Option. Im Wesentlichen handelt es sich dabei um zwei INFORMATION LIFECYCLE MANAGEMENT neue Features – die Heat Map und die automatische Daten­optimierung (Englisch Automatic Data Optimization). Die Heat Map „trackt“ Veränderungen und Abfragen auf Zeilen und Segmentebene und gibt einen detaillierten Überblick über den Zugriff auf die Daten. Die automatische Datenoptimierung verlagert und/oder komprimiert die Daten gemäß nutzerdefinierter Regeln (Englisch policies) basierend auf den Informationen, die sich aus der Heat Map ergeben. Wichtig zu wissen ist, dass in Release 1 noch einige Einschränkungen existieren, die unbedingt bei der Nutzung berücksichtigt werden müssen. Die ILM-Funktionen stehen beispielsweise im Moment nur in einer Nicht-MultitenantArchitektur (auch NON CDB) zur Verfügung. Bevor über eine Automatisierung der optimalen Datenablage nachgedacht werden kann, müssen die Daten katego­ risiert werden. Im Klartext bedeutet dies, dass die Daten je nach Zugriffsstatistik in unterschiedliche Kategorien eingeteilt werden – natürlich automatisch ohne Interaktion durch den Nutzer oder DBA. In Oracle Database 12c ist diese Funktion über das sogenannte Heat Map Feature implementiert. Heat Maps sollen einen Überblick über die Aktivitäten auf den unterschiedlichen Objekten geben. Dabei wird nicht nur die Segmentebene berücksichtigt, sondern 55 56 INFORMATION LIFECYCLE MANAGEMENT es wird sogar die aktuellste Veränderung auf Blockebene mitdokumentiert. Die Aktivitäten bestehen aus Lese- und Schreiboperationen. Sogar Table beziehungsweise Index Lookups werden mitgeschrieben. Damit kein verfälschtes Bild entsteht, werden operative Eingriffe, wie Statistikmanagement, Verlagerungen usw. nicht vermerkt. Wie funktioniert nun das Heat Map Feature? Eingeschaltet wird die Funktion über einen einzigen dynamischen Initialisierungsparameter HEAT_MAP (Werte ON bzw. OFF). Die Defaulteinstellung ist dabei OFF. ALTER SYSTEM set HEAT_MAP=ON; Nach Aktivierung der Heat Map über den Initialisierungsparameter werden automatisch alle Zugriffe über einen speziellen In-Memory-Zugriff geloggt. Zugriffe auf Objekte im SYSTEM und SYSAUX Tablespace werden dabei ausgelassen. Der Zugriff auf die Heat Map kann dann über die Standardschnittstellen wie Data Dictionary Views, Fixed Tables oder PL/SQL Packages erfolgen. Eine grafische Schnittstelle in Cloud Control 12c ist geplant. Folgende Beispiele sollen einen kleinen Einblick in die verschiedenen Verwendungsweisen geben. 57 INFORMATION LIFECYCLE MANAGEMENT Einen ersten aktuellen Einblick liefert beispielsweise die View V$HEAT_MAP_SEGMENT. Sie zeigt Realtime-Informationen über die Segmentzugriffe. Das folgende Listing zeigt einen Auszug zur Trackzeit 15:19 Uhr am 11. Juli. Die Objekte, deren Spalten den Wert YES beinhalten, sind aktuell im Zugriff. SELECT h.object_name, o.object_type, h.track_time, h.segment_write write, h.segment_read read, h.full_scan, h.lookup_scan FROM v$heat_map_segment h join dba_objects o ON (o.object_id=h.obj#); OBJECT_NAME OBJECT_TYPE TRACK_TIME WRI REA FUL LOO ----------------- --------------- ---------------- --- --- --- --PRODUCTS TABLE 11.07.2013 15:19 YES NO NO NO DEPARTMENTS TABLE 11.07.2013 15:19 NO NO NO NO CONFIG$ TABLE 11.07.2013 15:19 NO NO NO NO TAB_300_300 INDEX 11.07.2013 15:19 NO NO NO NO TAB_300 TABLE 11.07.2013 15:19 NO NO YES NO TAB_300_OLTP TABLE 11.07.2013 15:19 NO NO NO NO TAB_300_OLTP TABLE 11.07.2013 15:19 NO NO NO NO ... Mit ALL_, DBA_, und USER_HEAT_MAP_SEGMENT kann man den letzten Zugriff auf die Segmente anzeigen. Folgendes Codebeispiel listet die Zugriffe auf einige der Objekte des Users SH auf. Wie zu erkennen ist, werden 58 INFORMATION LIFECYCLE MANAGEMENT Lese- und Schreibzugriffe dokumentiert und darüber hinaus die Full Table Scans beziehungsweise die zugehörigen Index Scans aufgelistet. SELECT object_name, segment_write_time write, full_scan, lookup_scan FROM dba_heat_map_segment WHERE owner ='SH' AND object_name!='SALES' ORDER BY 2,3; OBJECT_NAME WRITE FULL_SCAN LOOKUP_SCAN ----------------- ----------------- ----------------- ----------------TAB_300_OLTP 10.07.2013 17:21 10.07.2013 17:21 TAB_300 10.07.2013 17:21 11.07.2013 15:01 TABLE_300_SELECT 10.07.2013 18:22 PRODUCTS 11.07.2013 15:01 PRODUCTS_PK 11.07.2013 15:01 CUSTOMERS_PK 26.06.2013 12:30 25.06.2013 12:48 11.07.2013 15:01 25.06.2013 22:48 ... Aus Gründen der Übersichtlichkeit wurde die Spalte SUBOBJECT_NAME nicht selektiert. Im Fall von Zugriffen auf partitionierte Tabellen, wie zum Beispiel im Fall der Tabelle SALES, ist dies natürlich zur genauen Segmentanalyse unbedingt erforderlich. Interessiert man sich nur für die Objekte und Tablespaces, die am häufigsten im Zugriff waren, kann man die Views DBA_HEATMAP_TOP_OBJECTS beziehungsweise DBA_HEATMAP_TOP_TABLESPACES verwenden. Im nächsten Beispiel sind die drei top Tablespaces unter Angabe der jeweiligen Objektanzahl und des verwendeten Speicherplatzes aufgelistet. Automatische DatenOptimierung SELECT tablespace_name, segment_count, allocated_bytes, min_ writetime, max_writetime FROM dba_heatmap_top_tablespaces; TABLESPACE_NAME SEGMENT_COUNT ALLOCATED_BYTES MIN_WRITE MAX_WRITE --------------- ------------- --------------- --------- --------ADOTEST 16 EXAMPLE 334 190775296 18-JUN-13 05-JUL-13 20 5235408896 21-JUN-13 10-JUL-13 USERS 135266304 So wird beispielsweise der erste beziehungsweise letzte Schreibzugriff auf Objekte im entsprechenden Tablespace mitgeschrieben. 6.1 AUTOMATISCHE DATENOPTIMIERUNG Um zu erklären, was mit automatischer Datenoptimierung gemeint ist, soll folgendes Beispiel einen möglichen Anwendungsfall skizzieren. Zuerst werden Daten mit BulkLoad-Operationen oder anderen konventionellen Methoden in die Tabellen geladen und unterliegen dabei starken Veränderungen. Zu diesem Zeitpunkt ist eine Komprimierung noch nicht erwünscht, somit werde die Daten unkomprimiert gespeichert. Nach einer gewissen Zeit erfolgen nur noch vereinzelte Veränderungen über OLTP-Transaktionen. Nun kann es sinnvoll sein, die Daten aus Platzgründen in das OLTP-Komprimierungsformat zu konvertieren. Nach 59 60 Automatische DatenOptimierung einiger Zeit werden die Daten nur noch selten genutzt; nun könnten sie auf ein anderes Speichermedium ausgelagert werden – vielleicht sogar auf ein Speichermedium wie ZFS oder Pillar, die eine höhere Komprimierungsrate durch HCC-Komprimierung erlauben oder einfach nur auf ein beliebiges anderes Low Cost Storage-Medium. Abb.7: Beispiel für die automatische Datenoptimierung OLTP Quartal Advanced Row Compression für OLTP Reporting Compliance & Reporting 10 x komprimiert 15 x komprimiert Jahr Columnar Query Compression für schnelle Analysen Jahre zuvor Columnar Archive Compression für max. Kompression Automatische DatenOptimierung Das oben erläuterte Szenario lässt sich ab Oracle Database 12c einfach in der Datenbank abbilden und kann sogar in automatisierter Form ablaufen. Wichtiges Hilfsmittel zur Implementierung von automatischer Datenoptimierung sind die sogenannten Policies. Eine Policy-Spezifikation beinhaltet dabei eine Aktion wie zum Beispiel Compression oder Storage Tiering und zusätzlich eine Bedingung, unter der die Aktion ausgeführt werden soll. Policies können auf Segment- oder Row-Ebene implementiert werden. Folgendes Beispiel zeigt eine Segment Level Policy (Schlüsselwort: SEGMENT ), die automatisch eine Tabelle in das OLTP-Komprimierungsformat umwandelt, nachdem 20 Tage keine Veränderungen (Schlüsselwort: NO MODIFICATION ) erfolgt sind. ALTER TABLE sh.sales ILM ADD POLICY ROW STORE COMPRESS ADVANCED SEGMENT AFTER 20 DAY OF NO MODIFICATION; ROW STORE COMPRESS ADVANCED ist dabei übrigens die neu eingeführte Syntax für OLTP Compression in 12c. Das nächste Beispiel zeigt eine ROW Policy. Oracle evaluiert in regelmäßigen Abständen die Blöcke der ORDERS Tabelle. Jeder Block, der den Anforderungen – in unserem Fall 1 DAY OF NO MODIFICATION – genügt, wird komprimiert, um wieder ausreichend Platz zu schaffen. 61 62 Automatische DatenOptimierung ALTER TABLE sh.customers ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 1 DAY OF NO MODIFICATION; Diese Policy ermöglicht höchst mögliche Performance beim Laden von Daten und zusätzlich die Vorteile der Platzersparnis durch die Komprimierung. Im Gegensatz zum SegmentPolicy-Beispiel muss nicht darauf gewartet werden, bis eine ganze Partition den Anforderungen genügt. Nun stellt sich die Frage, wann diese Policies evaluiert werden? Da die Aktionen automatisch im Hintergrund ablaufen sollen, bietet sich das Maintenance Window des Default Maintenance Plans zur Evaluierung und Ausführung an. Möchte der DBA eingreifen, ist dies natürlich auch über die entsprechenden Kommandos möglich. Zusätzlich zu den gerade illustrierten Aktionen über Komprimierung gibt es auch die Möglichkeit der Verlagerung auf einen anderen Storage (auch Storage Tiering). Die Implementierung ist einfach, wie in folgendem Beispiel zu sehen ist. ALTER TABLE sh.sales ILM ADD POLICY TIER TO adotest; Diese Art von Policy wird durch den Füllgrad des entsprechenden Tablespaces getriggert. Ist der Quell-Tablespace 63 Automatische DatenOptimierung (hier USERS) annähernd voll, werden die Daten in den Tablespace ADOTEST verlagert. Die Eigenschaft „voll“ kann dabei durch den DBA beeinflusst werden. In unserem Beispiel ist der Tablespace bei 70 Prozent voll, wie die eingestellten Parameter zeigen. SELECT SUBSTR(name,1,32) name, value FROM dba_ilmparameters WHERE name LIKE 'TBS%'; NAME VALUE -------------------- ---------TBS PERCENT USED 70 TBS PERCENT FREE 30 Policies können natürlich ein- und ausgeschaltet oder auch gelöscht werden. Ein Monitoring ist wie beim Heat Map Feature über die entsprechenden Views wie zum Beispiel DBA_ILMDATAMOVEMENTPOLICIES und DBA_ILMOBJECTS möglich. Folgendes abschließendes Beispiel zeigt einen Ausschnitt aus den im Kapitel benutzten Policies. OBJECT_NAME SUBOBJECT_NAME ACTION_TYPE SCOPE TIER_TABLESPACE ------------- --------------- ----------- ------- --------------CONDITION_TYPE DAYS ---------------------- ---CUSTOMERS LAST MODIFICATION TIME COMPRESSION ROW 1 64 Automatische DatenOptimierung SALES SALES_1995 STORAGE SEGMENT ADOTEST STORAGE SEGMENT ADOTEST STORAGE SEGMENT ADOTEST 0 SALES SALES_1996 0 SALES SALES_H1_1997 0 Die neuen ILM Features ermöglichen eine automatische Datenkomprimierung beziehungsweise eine automatisierte Verlagerung der Daten auf ein anderes Storage-Medium. Wichtige Voraussetzung ist dabei die Nutzung beziehungsweise das Einschalten des Heat Map Features auf System­ ebene. Die Operationen erfolgen dabei im Hintergrund und können im Fall von Partitionen sogar vollständig online ausgeführt werden. Dieses Kapitel konnte nur einen kleinen Ausschnitt der Funktionalität demonstrieren. So ist es zum Beispiel auch möglich, eigene Funktionen zu definieren, um den Zeitpunkt des Storage Tierings oder der Komprimierung festzulegen. Wer mehr darüber erfahren möchte, dem sei geraten Handbücher, Blogs und White Paper zu konsultieren. DATA PUMP, EXTERNAL TABLES UND RMAN 7 Data Pump, External Tables und RMAN Nicht nur den aktuellen Datenbestand in der Datenbank effizient abzuspeichern muss ein Ziel bei der Speicherverwaltung sein, sondern auch die Backupgröße optimal zu verwalten. Daher bietet Oracle ab 11g eine Komprimierung von Tabellendaten beim Data Pump Export und eine verbesserte RMAN-Komprimierung über die Standardwerkzeuge an. Der Oracle Recovery Manager (kurz RMAN) ist das Werkzeug für Backup und Recovery von Oracle-Datenbanken, das optimale Performance und effizienten Platzverbrauch durch File Multiplexing und zusätzliche Komprimierung ermöglichen kann. Seit Oracle Database 10g ist dabei eine Backup Compression mit dem BZIP2-Algorithmus möglich. So können Backup-Sets komprimiert werden, bevor sie auf die Platte geschrieben werden. Bei der Nutzung dieses Backups ist kein zusätzlicher separater Dekomprimierungsschritt mehr notwendig. Folgende Syntax zeigt die Anwendung von Komprimierung beim RMAN Backup. RMAN> BACKUP AS COMPRESSED BACKUPSET DATABASE; Allerdings kann die Anwendung von Komprimierung die Dauer des Backups um ein Vielfaches verlängern. Aus 65 66 DATA PUMP, EXTERNAL TABLES UND RMAN ­ iesem Grund wurden ab 11g mit der Advanced Compresd sion Option weitere Algorithmen zur Verfügung gestellt, um die Geschwindigkeit beim Backup zu erhöhen. In 11g Release 1 handelte es sich dabei um den ZLIB-Algorithmus. Ab 11g Release 2 änderte Oracle seine Strategie und veröffentlicht nun nicht mehr die Namen der verwendeten Algorithmen. Die Bezeichnungen der Algorithmen lauten BASIC , LOW , MEDIUM und HIGH . Einstellbar ist der gewählte Algorithmus über das folgende RMAN-Kommando. Die Defaulteinstellung ist BASIC , die der 10g-Variante entspricht. RMAN> CONFIGURE COMPRESSION ALGORITHM 'BASIC|LOW|MEDIUM|HIGH'; Auskunft über die zur Verfügung stehenden Algorithmen und den Anwendungsfall gibt die View V$RMAN_COMPRESSION_ALGORITHM . LOW bietet beispielsweise maximale Geschwindigkeit bei der Komprimierung, HIGH hingegen die höchst mögliche Compression Ratio. SELECT algorithm_name name, algorithm_description, algorithm_compatibility compatibility FROM v$rman_compression_algorithm; NAME ALGORITHM_DESCRIPTION COMPATIBILITY --------- ------------------------------------- ------------BASIC good compression ratio 9.2.0.0.0 LOW maximum possible compression speed 11.2.0.0.0 67 DATA PUMP, EXTERNAL TABLES UND RMAN MEDIUM balance between speed and compression ratio 11.0.0.0.0 HIGH maximum possible compression ratio 11.2.0.0.0 4 rows selected Hinweis: Außer für den Algorithmus BASIC muss die Advanced Compression Option lizenziert sein. Wie viel schneller ein Backupset komprimiert beziehungs­ weise recovered werden kann, hängt von der Umgebung und dem gewählten Algorithmus ab. Falls ein I/O-Bottle­ neck vorliegt aber CPU zur Verfügung steht, kann der Algorithmus HIGH zu guten Ergebnissen führen. HIGH ver­­wendet mehr CPU bei hoher Platzeinsparung und vermindert somit die Anzahl der I/Os zum Schreiben des Backups. Auf der anderen Seite kann bei einer Begrenzung der CPU-Ressource der Einsatz von LOW oder MEDIUM sinnvoller sein. Komprimierte Daten in der Datenbank werden übrigens bei Einsatz der RMAN-Komprimierung weiter minimiert. Der Einsatz kann also auch in diesem Fall sinnvoll sein. Es zeigt sich, dass mit diesen Algorithmen Platzeinsparungen bis zu 80 Prozent sogar bei höherer Backup-Performance (ca. 60 Prozent) erzielt werden können. Weitere Ergebnisse aus Kunden POCs finden sich im White Paper „Oracle Advanced Compression Helps Global Fortune 500 Company” (siehe Punkt 12: Weitere Informationen). Ein Test des Backup-Szenarios sollte daher vorab immer in Betracht gezogen werden. 68 DATA PUMP, EXTERNAL TABLES UND RMAN Auch der Data Pump Export profitiert von Komprimierungsmöglichkeiten. Bislang wurden automatisch nur die Metadaten komprimiert; mit 11g und der Advanced Compression Option können nun auch die Tabellendaten komprimiert werden. Beim Data Pump Export unter Angabe der Option compression=all werden automatisch die Tabellendaten komprimiert; beim Import ist keine weitere Angabe beziehungsweise kein weiterer Dekomprimierungsschritt nötig. Dabei bleibt die Komprimierung vollständig applikationstransparent; somit gibt es keine Einschränkungen bei der Data-Pump-Funktionalität. Auch hier sind Komprimierungen von 75 Prozent keine Besonderheit und können mit Werkzeugen wie GNU zip verglichen werden. Auch hier finden sich Beispiele im schon erwähnten „White Paper Oracle Advanced Compression Helps Global Fortune 500 Company“. Folgendes Listing zeigt die Nutzung mit dem Data Pump Export. Mögliche Einstellungen für den Parameter COMPRESSION sind METADATA_ONLY , DATA_ONLY und ALL . Für die Einstellung ALL und DATA_ONLY ist die Lizenzierung der Advanced Compression Option nötig. expdp compression=all directory=dumpdir dumpfile=back_comp1.dmp ... Normalerweise werden die Tabellen mit der gleichen Compression-Einstellung wie beim Export importiert. Neu mit DATA PUMP, EXTERNAL TABLES UND RMAN 12c ist die Möglichkeit, diese Einstellung zu ändern. Unabhängig von der Einstellung im Export beziehungsweise von der Einstellung im Tablespace der Zieldatenbank können somit Tabellen mit eigenen Compression-Einstellungen erzeugt werden. Dazu ist ein neuer Metadaten TRANSFORM Parameter nötig. Folgendes Beispiel zeigt eine Implementierung. Der Tablespace der Zieldatenbank besitzt keine Compression-Einstellung. Die Tabelle wird im folgenden Beispiel mit der Eigenschaft Basic Compression importiert. impdp dumpfile=sh.dmp directory=home tables=sh.cust_copy TRANSFORM = TABLE_COMPRESSION_CLAUSE:\"COMPRESS BASIC\" Die Compression-Klauseln (TABLE_COMPRESSION_CLAUSE ) entsprechen dabei der Tabellen-Compression-Klauseln im CREATE oder ALTER TABLE -Kommando. Mit Oracle Version 10g sind External Tables um das Schreiben/­ Entladen von Daten erweitert worden. Dabei werden die Daten aus der Datenbank in eine binäre Datei geschrieben­ und können dann einfach und schnell auf einem anderen­ System zur Verfügung gestellt werden. Wie bei der ursprüng­ lichen Verwendung von External Tables ist auch hier der Zugriff auf ein logisches Datenbank-Directory notwendig. Das Entladen der Daten aus der Datenbank erfolgt dann mit der erweiterten External-Table-Syntax. Die Daten werden durch 69 70 DATA PUMP, EXTERNAL TABLES UND RMAN das SELECT Statement definiert und in einer binären Datei im logischen Directory abgelegt. Neu mit 12c ist die Verwendung von COMPRESSION [ENAB- LED {BASIC|LOW|MEDIUM| HIGH} | DISABLED] . Hiermit wird angegeben, ob und wie die Daten komprimiert werden sollen, bevor sie in der binären Datei abgelegt werden. Folgendes Beispiel zeigt eine Verwendung. CREATE TABLE sh.ext_sales_products_basic ORGANIZATION EXTERNAL ( TYPE oracle_datapump DEFAULT DIRECTORY home ACCESS PARAMETERS (compression enabled basic) LOCATION ('sales_prod.exp_low')) REJECT LIMIT UNLIMITED AS SELECT p.prod_name, s.quantity_sold, s.cust_id FROM sh.sales s JOIN sh.products p USING (prod_id); Wie aus der Syntax zu ersehen ist, können zusätzliche Attribute wie BASIC , LOW , MEDIUM und HIGH bei der Spezifizierung der Komprimierung mitgegeben werden. BASIC bietet dabei eine gute Kombination aus Ratio und Geschwindigkeit. LOW ist geeignet bei Umgebungen mit NETZWERKKOMPRIMIERUNG eingeschränkten CPU-Ressourcen. Die Compression Ratio wächst normalerweise von LOW nach HIGH – in Abhängigkeit von den zur Verfügung stehenden CPU-Ressourcen. Hinweis: Dieses Feature benötigt die Lizenzierung der Advanced Compression Option. 8 Netzwerkkomprimierung Netzwerkperformance ist häufig begrenzt durch die Bandbreite und das Datenvolumen. Erhöhen der Netzwerkperformance bedeutet also entweder Vergrößerung der Bandbreite oder Minimieren des Datenvolumens. Komprimierung der Daten, die über das Netzwerk transferiert werden, ist somit eine wichtige Option, um Performance zu erhöhen. Oracle bietet diese Möglichkeit im Data-Guard-Umfeld ab 11g und in 12c sogar generell über die entsprechenden Netzwerkeinstellungen. Im ersten Fall können die Redo-Daten, die über den Data Guard Redo Transport Service übermittelt werden, komprimiert werden. Redo-Komprimierung kann zu geringeren Redo-Transfer-Zeiten und somit schnelleren Redo-GapResolution-Zeiten und weniger Netzwerkbelastung führen. 71 72 NETZWERKKOMPRIMIERUNG Vorteile bringt Redo Compression sicherlich bei niedriger Netzwerkbandbreite und hohen Erwartungen an die Recoveryzeiten. Besonders deutlich wird dies bei Datenbanken mit hoher Redo-Rate und eher niedriger Netzwerkbandbreite. Dabei sollte man natürlich nicht vergessen – wie auch übrigens bei der Komprimierung von unstrukturierten Daten –, dass ausreichend CPU-Ressourcen für die Durchführung der Komprimierung zur Verfügung stehen. Wie wird die Redo-Komprimierung nun aktiviert? Ab 11g Release 2 wird die Einstellung entweder direkt bei der Angabe des Parameters LOG_ARCHIVE_DEST_n mitgegeben oder über den Data Guard Broker. LOG_ARCHIVE_DEST_n='SERVICE=o1 COMPRESSION=ENABLE' Mit Data Guard Broker kann folgende Syntax verwendet werden. DGMGRL> edit database 'o1 SET PROPERTY 'RedoCompression'= ENABLE; Tipp aus der Praxis: Gibt es Möglichkeiten die Einsparungen beziehungsweise die Compression Ratio zu bestimmen? Der Compression Advisor liefert hier (noch) keine Implementierung. Da der hier verwendete Algorithmus allerdings dem gzip mit Level 1 entspricht, kann ein einfacher Test mit einer archivierten Log-Datei die Frage beantworten. NETZWERKKOMPRIMIERUNG Neu in 12c ist die Möglichkeit, das SQL*Net-Datenvolumen zwischen Client und Server zu komprimieren. Die Konfiguration erfolgt dabei über die Einstellung der neuen SQL*Net-Parameter SQLNET.COMPRESSION, SQLNET.COMPRESSION_LEVELS und SQLNET.COMPRESSION_THRESHOLD . Die Verwendung kann auf verschiedenen Ebenen wie Connection (z. B. connect string), Service (tnsnames.ora, ldap.ora) oder Datenbank (sqlnet.ora) statt finden. Auch hier ist die Voraussetzung die Lizenzierung der Advanced Compression Option. Folgende Beispiele zeigen die Verwendung. SQLNET.COMPRESSION schaltet die automatische Komprimierung ein. Der Default ist OFF. SQLNET.COMPRESSION=on SQLNET.COMPRESSION_LEVELS bestimmt die Ebene der Komprimierung. Der Default ist LOW. SQLNET.COMPRESSION_LEVELS=(high) bestimmt ab welcher Größenordnung (in Bytes) die Komprimierung durchgeführt wird. Der Wert gibt die minimale Größe an. Der Default ist 1024 Bytes. SQLNET.COMPRESSION_THRESHOLD 73 74 OPTIMIERUNG FÜR FLASHBACK-DATA-ARCHIVE-TABELLEN SQLNET.COMPRESSION_THRESHOLD=1024 Unabhängig von der Einstellung der Komprimierung kann natürlich weiterhin der SDU-Wert als Einstellung verwendet werden. Zur Erinnerung SDU (kurz für session data unit) ist die Größe der Datenpakete, die über das Netzwerk versendet werden. Mögliche Werte rangieren zwischen 512 und 2097152 Bytes. 9 Optimierung für Flashback-DataArchive-Tabellen Daten werden gespeichert und zum Teil lange aufbewahrt. Mitunter werden die Daten nach ihrer ersten Speicherung geändert, vielleicht sogar mehrfach. Je nach gesetzlicher oder betrieblicher Vorgabe müssen die Veränderungen nachverfolgbar sein. Damit sind zugleich Mechanismen gefordert, die sicherstellen, dass die Folge der Versionen lückenlos ist. Und implizit bedeutet das zusätzlich, dass die Versionen auch vor Löschen und Verändern geschützt sein müssen. Flashback Data Archives lösen diese Frage, denn sie bieten nicht nur einen wirksamen Mechanismus zum Versionieren von Datensätzen, sondern sie schützen diese Versionen auch vor Veränderung und löschen sie schließlich sogar automatisch nach Ablauf ihrer Aufbewahrungsfrist. OPTIMIERUNG FÜR FLASHBACK-DATA-ARCHIVE-TABELLEN Ursprünglich sind die Archive mit Oracle Database 11g Release 1 auch unter dem Namen Total Recall eingeführt wurden – was übersetzt so viel heißt wie: das perfekte Gedächtnis. Diese Option ist allerdings seit Ende Juni 2012 nicht mehr im Lizenzumfang enthalten (siehe Hinweis am Ende dieses Kapitels). Wie funktioniert nun Flashback Data Archive? Automatisch werden Änderungen an Tabellen auf Zeilenebene „getrackt“ und eine Historie auf Zeilenebene – den sogenannten Archiven oder Flashback Data Archives (auch FDA) – zur Verfügung gestellt. Ein wesentlicher Unterschied zwischen den Möglichkeiten der bekannten UNDO-Mechanismen und denen der Archive ist folgender: Der normale UNDOMechanismus der Datenbank sammelt für alle Veränderungen in der Datenbank UNDO-Informationen und ist in produktiven Umgebungen in der Regel auf einige Stunden oder maximal Tage begrenzt. Mit FDA und der Verbindung zu einzelnen Tabellen werden hingegen viel effizientere Möglichkeiten geboten, auf einen größeren Zeitraum von selektiven Daten zu zugreifen. Dabei kann das Volumen dieser Flashback Data Archives natürlich mit der Zeit sehr groß werden. Um die Speicherung zu optimieren, lohnt es sich daher eine Optimierung beim CREATE FLASHBACK ARCHIVE beziehungsweise ALTER 75 76 OPTIMIERUNG FÜR FLASHBACK-DATA-ARCHIVE-TABELLEN FLASHBACK anzugeben. Diese ist nicht als Defaulteinstellung wirksam und muss zusätzlich mit der Advanced Compression Option lizenziert werden. Folgendes Beispiel zeigt wie die Optimierung eingeschaltet werden kann. CREATE FLASHBACK ARCHIVE test_archive TABLESPACE users QUOTA 300 M OPTIMIZE DATA RETENTION 1 DAY; Hinweis: Ohne den Einsatz dieser Optimierung das heißt ohne die Klausel OPTIMIZE DATA (Default) beziehungsweise bei Verwendung von NO OPTIMIZE DATA steht Flashback Data Archive ab 11.2.0.4 in jeder Edition zur Verfügung. LIZENZIERUNG 10 Lizenzierung Für einige der im Dojo erwähnten Features ist die Lizenzierung der Enterprise Edition (Stand September 2013) nötig. Dabei handelt es sich beispielsweise um folgende Funktionen: • Online Index Rebuild • Online Table Redefinition • Online Datafile Move • Basic Table Compression •Bitmapped Index, bitmapped Join Index und Bitmap Plan Konvertierungen Zusätzlich dazu ist für die Nutzung der folgenden Features die Lizenzierung der Advanced Compression Option (Stand September 2013) nötig: • Advanced Row Compression (auch OLTP Compression) • Advanced LOB Compression • Advanced LOB Deduplication •RMAN Backup Compression (RMAN DEFAULT COMPRESS benötigt keine Lizenz) •Data Pump Data Compression (COMPRESSION=METADATA_ONLY benötigt keine Lizenz) 77 78 LIZENZIERUNG • Heat Map • Automatic Data Optimization • Data Guard Redo Transport Compression • Advanced Network Compression • Optimierung für Flashback Data Archive History Tables • Storage Snapshot Optimization • Online Move Partition (für alle komprimierten Formate) Zur Verifizierung des aktuellen Stands wird die Lektüre des Handbuchs Oracle Database Licensing Information 12c Release 1 (12.1) empfohlen. FAZIT UND AUSBLICK 11 Fazit und Ausblick Komprimierung ist in der Datenbank ein nicht mehr weg­ zu­denkendes Feature, das in jedem Release weiterentwickelt wird. Um herauszufinden, ob Komprimierung in der eigenen Umgebung sinnvoll ist, sollte bei strukturierten Daten im ersten Schritt unbedingt der Compression Advisor genutzt werden. Nicht vergessen sollte man dabei auch die unstrukturierten Daten, da hier sehr viel Speicherplatz verwendet werden kann. Ab 12c bietet der Compression Advisor zusätzlich ein Interface für Large Objects. Tests sollten allerdings immer eingeplant werden, da es zu Veränderungen an Ausführungsplänen, Query und DML Performance kommen könnte. 79 80 WEITERE INFORMATIONEN 12 Weitere Informationen • My Oracle Support Notes: · Script to investigate a b-tree index structure (DOC ID 989186.1) · Master Note for OLTP Compression (Doc ID 1223705.1) · Using the new UTL_COMPRESS Oracle Supplied Package (Doc ID 249974.1) •OTN Download für Oracle Advanced Compression Advisor: http://www.oracle.com/technetwork/database/options/ compression/compression-advisor-095705.html •Deutschsprachige Tipps der DBA Community: http://blogs.oracle.com/dbacommunity_deutsch • Oracle White Paper: · Oracle Advanced Compression Helps Global Fortune 500 Company · Oracle Advanced Compression with Oracle Database 12c •Handbücher: · VLDB and Partitioning Guide · SQL Language Reference · PL/SQL Packages and Types Reference · Database Licensing Information Zugriff auf die komplette Oracle Dojo-Bibliothek unter http:// tinyurl.com/dojoonline Copyright © 2014, Oracle. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Herausgeber: Günther Stürner, Oracle Deutschland B.V. Design: volkerstegmaier.de // Druck: Stober GmbH, Eggenstein