パーティション・テーブル
パーティショニング機能はテーブルをパーティションと呼ばれる単位で物理的に分割し、管理性とパフォーマンスを向上させる機能です。Oracle Database Enterprise Editionに加えて、Partitioningライセンスを購入することで利用できます。
パーティション分割は基本的に列値によって行われます。パーティション化戦略(Partitioning Storategy)として、値の範囲(RANGE)、特定の値(LIST)、ハッシュ分割(HASH)とそれらの組み合わせ(コンポジット)を選択することができます。以前のバージョンでは、パーティション化戦略を後から変更することはできませんでした。Oracle Database 18cでは、RANGEパーティションから、HASHパーティションのように、パーティション化戦略を変更することができるようになりました。ONLINEオプションを指定することで、アプリケーションが稼働したままテーブルの変更を行うこともできます。
準備
パーティション・テーブルPART1を作成します。C1列に対して5つのパーティションを持つRANGEパーティション・テーブルです。パーティション・テーブルが作成できたらダミーのデータを格納します。
SQL> CREATE TABLE part1 (c1 NUMBER PRIMARY KEY, c2 NUMBER, c3 VARCHAR2(10))
PARTITION BY RANGE(c1) (
PARTITION p1 VALUES LESS THAN(100000),
PARTITION p2 VALUES LESS THAN(200000),
PARTITION p3 VALUES LESS THAN(300000),
PARTITION p4 VALUES LESS THAN(400000),
PARTITION p5 VALUES LESS THAN(500000)
);
表が作成されました。
SQL> INSERT INTO part1 SELECT LEVEL c1, 100 c2, 'data1' c3 FROM DUAL
CONNECT BY LEVEL < 500000;
499999行が作成されました。
LOCALインデックスをC2列に、GLOBALインデックスをC3列に作成します。
SQL> CREATE INDEX idx1_part1 ON part1(c2) LOCAL;
索引が作成されました。
SQL> CREATE INDEX idx2_part1 ON part1(c3) GLOBAL;
索引が作成されました。
パーティショニング戦略の変更
この状態からPART1テーブルをRANGEパーティションからHASHパーティションに変更します。ALTER TABLE MODIFY PARTITION文を実行します。ALTER TABLE文にONLINEを指定しているため、アプリケーションの動作を妨げません。
SQL> ALTER TABLE part1 MODIFY
PARTITION BY HASH(c1) (
PARTITION p1,
PARTITION p2,
PARTITION p3,
PARTITION p4
)
ONLINE
UPDATE INDEXES (
idx1_part1 LOCAL,
idx2_part1 GLOBAL
);
表が変更されました。
内部的には新しいパーティション・テーブルを作成してデータの移動を行っていると思われるため、実行には時間がかかります。
確認
ALTER TABLE文実行後の状態を確認します。USER_PART_TABLESビューを確認すると、4パーティションを持つHASHパーティション・テーブルに変更されていることがわかります。
SQL> SELECT table_name, partitioning_type, partition_count FROM USER_PART_TABLES;
TABLE_NAME PARTITION PARTITION_COUNT
------------------------------ --------- ---------------
PART1 HASH 4
インデックスの状態を確認します。これまでになかったLOCALインデックスがなぜか1つ増えています。
SQL> SELECT index_name FROM USER_INDEXES WHERE table_name='PART1';
INDEX_NAME
------------------------------
SYS_C007857
IDX1_PART1
IDX2_PART1
SQL> SELECT index_name, locality FROM USER_PART_INDEXES;
INDEX_NAME LOCALI
------------------------------ ------
IDX1_PART1 LOCAL
SYS_C007857 LOCAL
追加されたインデックスの対象列を確認します。
SQL> SELECT column_name FROM USER_IND_COLUMNS WHERE index_name='SYS_C007857';
COLUMN_NAME
------------------------------
C1
C1列に対してLOCALインデックスが作成される理由はわかりませんが、オンラインでパーティショニング戦略を変更できることは確認できました。
マニュアルは Oracle Database VLDBおよびパーティショニング・ガイド です。