LoginSignup
1
0

More than 3 years have passed since last update.

パーティション化戦略の変更機能を試す(Oracle Database 18c)

Last updated at Posted at 2019-07-22

パーティション・テーブル

 パーティショニング機能はテーブルをパーティションと呼ばれる単位で物理的に分割し、管理性とパフォーマンスを向上させる機能です。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およびパーティショニング・ガイド です。

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