Das Verschmelzen von Tabellenpartitionen kann ab Oracle Database 18c auch online ausgeführt werden. So zumindest drückt es die Option ONLINE im Kommando ALTER TABLE ... MERGE PARTITION aus. Was aber genau ist in diesem Zusammenhang unter "Online" zu verstehen? Dieser Tipp gibt Ihnen Klarheit.
Partitionierte Tabellen sind ein großartiges Hilfmittel, um den Zugriff und die generelle Handhabung großer Datenmengen zu beschleunigen. Alle Strategien zur Partitionierung gehen dabei davon aus, dass es ein Kriterium gibt, nach dem die Daten in Teile einer Tabelle eingruppiert werden können. Man kann es auch so vergleichen: Statt eines großen Fachs zur Aufbewahrung, werden die Daten in einzelnen Fächer, also gruppiert, gespeichert. Die Entscheidung, in welchem Fach, also Partition, die Daten liegen kann sich über die Zeit ändern. So kann es notwendig werden, mehrere Fächer zu einem gemeinsamen Fach zusammenzulegen. Dabei müssen die Daten auch physisch bewegt werden und damit ergibt sich die Frage, wie eine solche Operation durchgeführt wird, wenn gleichzeitig Datenänderungen in der Tabelle vorgenommen werden.
Gleiches gilt auch für den umgekehrten Fall, dass eine Partition in zwei neue Partitionen aufgeteilt werden soll. Für dieses sogenannte SPLIT Kommando wurde in der Version 12.2 der Oracle Datenbank schon die ONLINE Option eingeführt und sie verhält sich genauso, wie ab Oracle 18c beim MERGE Kommando: Ein SPLIT oder MERGE findet nicht gleichzeitig zu DML Operationen statt, die auf den betroffenen Partitionen ausgeführt werden. Die Option ONLINE regelt in diesem Fall nur die Frage, ob bei gleichzeitigen DML-Operationen eine Fehlermeldung erfolgt, oder nicht. Sind mehrere Partitionen von dem Kommando betroffen, führt das Kommando die Aktion für alle Partitionen aus, auf die es keine Sperren gibt und wartet nur auf die von Sperren betroffenen Partitionen.
Wenn in diesem Tipp der Begriff "Partitionen" verwendet wird, sind sowohl die Partitionen auf erster Ebene, als auch Subpartitionen gemeint.
Ein einfaches Beispiel soll das Vorgehen bei einem Zusammenlegen zweier Partitionen verdeutlichen. Dabei wird mit folgender Tabelle gearbeitet:
CREATE TABLE transactions ( id NUMBER , transaction_date DATE , value NUMBER ) PARTITION BY RANGE (transaction_date) ( PARTITION q1_2017 VALUES LESS THAN ( TO_DATE('01-APR-2017','dd-mon-yyyy')), PARTITION q2_2017 VALUES LESS THAN ( TO_DATE('01-JUL-2017','dd-mon-yyyy')), PARTITION q3_2017 VALUES LESS THAN ( TO_DATE('01-OCT-2017','dd-mon-yyyy')), PARTITION q4_2017 VALUES LESS THAN ( TO_DATE('01-JAN-2018','dd-mon-yyyy')), PARTITION q1_2018 VALUES LESS THAN ( TO_DATE('01-APR-2018','dd-mon-yyyy')), PARTITION q2_2018 VALUES LESS THAN ( TO_DATE('01-JUL-2018','dd-mon-yyyy')), PARTITION q3_2018 VALUES LESS THAN ( TO_DATE('01-OCT-2018','dd-mon-yyyy')), PARTITION q4_2018 VALUES LESS THAN ( TO_DATE('01-JAN-2019','dd-mon-yyyy')) ); begin for i in 1..1000000 loop insert into transactions values (i,to_date('31.12.2017','dd.mm.yyyy')-dbms_random.value(1,400),dbms_random.value(1,40000)); commit; end loop; end; /
Lassen wir eine Datenbanksitzung Daten in der Partition "q1_2017" ändern:
Session 1: select count(*) from transactions where transaction_date between to_date('01.03.2017','dd.mm.yyyy') and to_date('31.03.2017','dd.mm.yyyy'); COUNT(*) ---------- 74817 update transactions set value=value+1 where transaction_date between to_date('01.03.2017','dd.mm.yyyy') and to_date('31.03.2017','dd.mm.yyyy'); 74817 rows updated.
Die Transaktion ist noch nicht beeendet und die Session hält die entsprechenden Sperren in der Partition "q1_2017". Der Versuch, die Partitionen q3_2017 und q4_2017 zu verschmelzen wird problemlos ausgeführt, da es keine Session gibt, die Sperren auf diesen Partitionen hält.
Session 2: ALTER TABLE transactions MERGE PARTITIONS q3_2017, q4_2017 INTO PARTITION h2_2017 UPDATE INDEXES; Table altered.
Jedoch wird das Verschmelzen der Partitionen q1_2017 und q2_2017 zu einem Fehler führen:
Session 2: ALTER TABLE transactions MERGE PARTITIONS q1_2017, q2_2017 INTO PARTITION h1_2017 UPDATE INDEXES; ALTER TABLE transactions * ERROR at line 1: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Mit der Option ONLINE können Sie diese Fehlermeldung vermeiden. Dabei wird das Kommando aber nicht sofort ausgeführt, sondern wartet solange, bis die Sperren auf die betroffenen Partitionen freigegeben wurden. Sobald aber keine Sperren mehr auf den betroffenen Partitionen bestehen, wird das Kommando ausgeführt. Die Datenbankadministration muß also nicht erst einen Zeitraum finden, wo es keine störenden Sperren gibt.
Session 2: ALTER TABLE transactions MERGE PARTITIONS q1_2017, q2_2017 INTO PARTITION h1_2017 UPDATE INDEXES ONLINE;
Diese Session wartet jetzt solange, bis alle Sperren freigeben sind. Im vorliegenden Beispiel beendet die Session 1 die Transaktion durch ein ROLLBACK.
Session 1: SQL> rollback; Rollback complete.
Jetzt wird das MERGE sofort ausgeführt.
Session 2: : Table altered.
Das SPLIT Kommando, hat das gleiche Verhalten bzgl. der ONLINE Option wie das MERGE Kommando.
Mit der ONLINE Option der Komandos MERGE PARTITIONS bzw. SPLIT PARTITION kann die Operation zwar nicht gleichzeitig zu laufenden DML-Transaktionen, die in den betroffenen Partitionen Sperren halten, ausgeführt werden. Dennoch ist die ONLINE Option sehr hilfreich, da sie automatisch dann ausgeführt wird, sobald alle Sperren auf den betroffenen Partitionen freigegeben sind.
Diese Funktionalität ist Bestandteil der Partitioning Option. Diese muß separat zur Enterprise Edition lizenziert sein. Es gibt auch Servicepakete in der Oracle Cloud, in denen diese Option enthalten ist.
Weitere Informationen
Zurück zum Anfang des Artikels
Zurück zur Community-Seite