インターバル・レンジパーティショニングは、範囲パーティショニングを拡張した機能であり、データの挿入に応じて新しいパーティションを自動的に作成します。挿入されたデータが最後に定義された範囲パーティションの上限値(high value)を超えると、データベースは新たなパーティションを作成します。この処理には手動による介入は不要です。
インターバル・レンジパーティショニングを利用するには、INTERVAL 句を CREATE TABLE 文に含め、パーティションのサイズを指定します。パーティションキーの値に基づき、各範囲パーティションの上限値(high value)が決定され、これはトランジションポイントとして機能します。この境界値を超えるデータが挿入されると、自動的にパーティションが作成されます。
スキップ動作の仕組み:データが現在のトランジションポイントより 2 つ以上の間隔分先の範囲に該当する場合、データを実際に格納するパーティションのみが作成され、中間のパーティションは作成されません。
例:間隔が 1 ヶ月で、現在のトランジションポイントが 2019 年 2 月 15 日であるとします。2019 年 5 月 10 日付の行を挿入すると、2019 年 4 月 15 日~2019 年 5 月 15 日をカバーするパーティションが作成されます。2019 年 2 月 15 日~2019 年 3 月 15 日および 2019 年 3 月 15 日~2019 年 4 月 15 日のパーティションはスキップされ、データを実際に格納するパーティションのみが作成されます。
構文
CREATE TABLE [schema.]<table_name>
<table_definition>
PARTITION BY RANGE (<column> [, <column>]...)
[INTERVAL (<constant> | <expression>)]
[SUBPARTITION BY {RANGE | LIST | HASH} (<column> [, <column>]...)]
(<range_partition_definition> [, <range_partition_definition>]...);ここで、range_partition_definition は以下のとおりです。
PARTITION [<partition_name>]
VALUES LESS THAN (<value> [, <value>]...)
[TABLESPACE <tablespace_name>]
[(<subpartition>, ...)]INTERVAL パラメーターには、数値式および時間式を指定できます。
| タイプ | 式 | 効果 |
|---|---|---|
| 数値 | INTERVAL (10) | 連続する 10 個の値ごとに 1 つのパーティションが作成される |
| 年 | INTERVAL (NUMTOYMINTERVAL(1, 'year')) | 1 年ごとに 1 つのパーティションが作成される |
| 月 | INTERVAL (NUMTOYMINTERVAL(1, 'month')) | 1 ヶ月ごとに 1 つのパーティションが作成される |
| 日 | INTERVAL (NUMTODSINTERVAL(1, 'day')) | 1 日ごとに 1 つのパーティションが作成される |
| 週 | INTERVAL (NUMTODSINTERVAL(7, 'day')) | 1 週間ごとに 1 つのパーティションが作成される |
CREATE TABLE ... PARTITION BY の完全な構文については、「CREATE TABLE... PARTITION BY」をご参照ください。
例
次の例では、sales テーブルを sold_month 列でパーティション化し、1 ヶ月間隔のインターバル・レンジパーティショニングを適用しています。2 つの初期範囲パーティションによりトランジションポイントが確立され、そのポイントを超える行の挿入によって自動的にパーティションが作成されます。
テーブルの作成:
CREATE TABLE sales
(
prod_id int,
prod_quantity int,
sold_month date
)
PARTITION BY RANGE(sold_month)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
PARTITION p1
VALUES LESS THAN('15-JAN-2019'),
PARTITION p2
VALUES LESS THAN('15-FEB-2019')
);初期パーティションの照会:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS; partition_name | high_value
----------------+--------------------------------------------------------------
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(2 rows)トランジションポイントを超える行の挿入:
INSERT INTO sales VALUES (1, 200, '10-MAY-2019');INSERT 0 1パーティションの再照会:
SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS; partition_name | high_value
----------------+--------------------------------------------------------------
SYS596430103 | FOR VALUES FROM ('15-APR-19 00:00:00') TO ('15-MAY-19 00:00:00')
P1 | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
P2 | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(3 rows)データベースは、2019 年 5 月 10 日付の行を格納するための新しいパーティションを自動的に 1 つ作成しました。2019 年 2 月 15 日~2019 年 3 月 15 日および 2019 年 3 月 15 日~2019 年 4 月 15 日のパーティションは、対応するデータが存在しないためスキップされました。
システムは、自動的に作成された各パーティションに SYS で始まる名前(例:SYS596430103)を割り当てます。この名前はセッションごとに一意ですが、セッションによって異なる場合があります。
インターバル・レンジパーティショニングの制限事項
パーティションキーは、数値または日付の範囲を指定する単一列である必要があります。
INTERVAL句が有効になる前に、少なくとも 1 つの範囲パーティションを定義する必要があります。索引構成表では、
INTERVAL句はサポートされていません。リストパーティション化されたテーブルには、ドメインインデックスを作成できません。
パーティションキー列には、NULL、Not-a-Number(NaN)、無限大(Infinity)の値を含めることはできません。
INTERVAL句内の式は、非負の定数値に評価される必要があります。インターバル・レンジパーティションは、昇順でのみ作成されます。