oracle

自動リスト・パーティション・テーブル(Oracle Database 12c Release 2新機能)を試す

More than 1 year has passed since last update.

Oracle Database 12c Release 2の新機能である自動リスト・パーティションを試します。

自動リスト・パーティション・テーブル

Oracle Database 12c Release 1以前のリスト・パーティション・テーブルでは、パーティション列に格納できる値はあらかじめ決定され、事前にパーティションを作成しておく必要がありました。
レンジ・パーティション・テーブルでは自動的にパーティションを作成するインターバル・パーティション・テーブルが利用できます。Oracle Database 12c Release 2では、パーティション化列に新しい値が格納さると同時にパーティションが作成される「自動リスト・パーティション・テーブル」が利用できるようになりました。

自動リスト・パーティション・テーブルの作成

自動リスト・パーティション・テーブルを作成するには、CREATE TABLE文のPARTITION句にAUTOMATICを指定するだけです。CREATE TABLE文には最低限一つのパーティション定義が必要です。
自動リスト・パーティションの確認は、{DBA|ALL|USER}_PART_TABLESビューのAUTOLIST列で確認できます。

SQL> CREATE TABLE plist1 (c1 VARCHAR2(10), c2 VARCHAR2(10)) PARTITION BY LIST (c1) AUTOMATIC 
    (PARTITION p1 VALUES ('VALUE#1'));

Table created.

SQL> SELECT AUTOLIST FROM USER_PART_TABLES WHERE TABLE_NAME='PLIST1' ;

AUT
---
YES

自動リスト・パーティションに変更

通常のリスト・パーティション・テーブルを自動リスト・パーティション・テーブルに変更することができます。

SQL> ALTER TABLE plist1 SET PARTITIONING MANUAL ;

Table altered.

SQL> ALTER TABLE plist1 SET PARTITIONING AUTOMATIC ;

Table altered.

制約

自動リスト・パーティションには以下の制約があります。
1. CREATE TABLE文には最低一つのパーティション定義が必要です。
2. 自動的に作成されるパーティションの名前はSYS_P{9999}になります(9999は数字)
3. DEFAULTパーティションと同時には使用できません(DEFAULTパーティションに格納するか、新規パーティションを作成するか区別できないため)
4. 自動追加されるパーティション定義をサブ・パーティションに指定できません。
5. 最大パーティション数は1,000,000個です。
6. 外部表を使ったパーティション・テーブルにAUTOMATICを指定できません。
7. オプティマイザ統計はパーティション追加時に取得されません。

インデックス

テーブルに付与されたLOCALインデックス、GLOBALインデックスの状態を確認します。下記の通り、パーティションが自動追加されてもインデックスは自動的にメンテナンスされ、利用可能であることがわかります。

SQL> CREATE INDEX idx1_plist1 ON plist1 (c1) LOCAL ;

Index created.

SQL> CREATE INDEX idx2_plist1 ON plist1 (c2) GLOBAL ;

Index created.

SQL> INSERT INTO plist1 VALUES ('6-unique', 'test1') ; -- insert unique value

1 row created.

SQL> COMMIT ;

Commit complete.

SQL> SELECT STATUS FROM USER_IND_PARTITIOONS WHERE INDEX_NAME='IDX1_PLIST1' ;

PARTITION_NAME                 STATUS
------------------------------ --------
P1                             USABLE
SYS_P2601                      USABLE

SQL> SELECT STATUS FROM USER_INDEXES WHERE INDEX_NAME='IDX2_PLIST1' ;

STATUS
--------
VALID