LoginSignup
1
0

More than 3 years have passed since last update.

パーティションのオンライン・マージ機能を試す(Oracle Database 18c)

Last updated at Posted at 2019-07-09

パーティションの作成

 大規模なテーブルを分割して管理するパーティショニング機能は、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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0