パーティションの作成
大規模なテーブルを分割して管理するパーティショニング機能は、Oracle Database Enterprise Editionの優勝オプション(Partitioning Option)です。パーティショニング機能ははテーブルを列値によって分割します。分割された単位をパーティションと呼びます。
以下の例はPART1テーブルを列c1で4つのパーティション(p1, p2, p3, p4)に分割しています。列値の範囲(RANGE)で分割を行います。パーティションは独立したセグメントを構成するため、USER_OBJECTSビューを参照すると、別々のIDを割り当てられます。
SQL> CREATE TABLE part1 (c1 NUMBER, c2 VARCHAR2(10)) PARTITION BY RANGE(c1)
2 (
3 PARTITION p1 VALUES LESS THAN (1000000),
4 PARTITION p2 VALUES LESS THAN (2000000),
5 PARTITION p3 VALUES LESS THAN (3000000),
6 PARTITION p4 VALUES LESS THAN (4000000)
7 );
Table created.
SQL> SELECT OBJECT_ID, OBJECT_NAME, SUBOBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME='PART1';
OBJECT_ID OBJECT_NAME SUBOBJECT_NAME
---------- ------------------------------ ------------------------------
73258 PART1 P3
73259 PART1 P4
73257 PART1 P2
73256 PART1 P1
73255 PART1 NULL
パーティションのマージ
複数のパーティションをまとめて一つにする操作をマージと呼びます。マージ操作はテーブルの構成変更となるため、テーブルに対するトランザクションが継続中の場合は実行できません。下記の例では各パーティション内のレコードを更新していますが、確定(COMMIT)していません。この状態で、ALTER TABLE MERGE PARTITIONS文を実行すると、ORA-00054 resource busy and acquire with NOWAIT specified or timeout expiredエラーが発生します。
SQL> UPDATE PART1 SET c2='UPDATE' WHERE c1 IN (500000, 1500000, 2500000, 3500000);
4 rows updated.
SQL> ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0;
ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Oracle Database 18cではマージ操作をオンラインで実行できるようになりました。実行方法はALTER TABLE MERGE PARTITIONS文にONLINE句を指定するだけです。下記の例ではONLINEを指定してパーティションp1とp2をパーティションp0にマージしています。パーティションp0には新しいオブジェクトIDが付与されていることがわかります。
SQL> ALTER TABLE part1 MERGE PARTITIONS p1, p2 INTO PARTITION p0 ONLINE;
Table altered.
SQL> SELECT OBJECT_ID, OBJECT_NAME, SUBOBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_NAME='PART1';
OBJECT_ID OBJECT_NAME SUBOBJECT_NAME
---------- ------------------------------ ------------------------------
73255 PART1 NULL
73276 PART1 P0
73258 PART1 P3
73259 PART1 P4
パーティションのオンライン・マージ機能は、サブ・パーティションのマージでも指定することができます。SQLリファレンス・マニュアル にも記載があります。パーティションのマージ機能は、RANGEパーティションまたはLISTパーティションとその組み合わせ(コンポジット)の場合のみ実行できます。
以下の例はHASHパーティションのマージを行おうとしていますがエラーになっています。
SQL> CREATE TABLE part2 (c1 NUMBER, c2 VARCHAR2(10)) PARTITION BY HASH(c1)
2 (
3 PARTITION p1,
4 PARTITION p2,
5 PARTITION p3,
6 PARTITION p4
7 );
Table created.
SQL> ALTER TABLE part2 MERGE PARTITIONS p1, p2 INTO PARTITION p0;
ALTER TABLE part2 MERGE PARTITIONS p1, p2 INTO PARTITION p0
*
ERROR at line 1:
ORA-14255: table is not partitioned by range, list, composite range, or
composite list method