テーブル作成後は、ビジネスニーズに応じて、テーブルのパーティショニング方法、パーティションタイプ、パーティションキーを変更できます。
パーティション方式の変更
OceanBaseデータベースのOracleモードでは、テーブルのパーティション方式を変更できます。パーティション方式の変換に対応している状況は次の表のとおりです。
パーティショニング方式 |
非パーティション |
パーティション |
サブパーティション |
|---|---|---|---|
| 非パーティション | - | サポート | サポート |
| パーティション | 不可 | - | 不可 |
| サブパーティション | 不可 | 不可 | - |
非パーティションテーブルをパーティションテーブルに変換する
ALTER TABLE ステートメントを使用して、非パーティションテーブルを任意のパーティションタイプのパーティションテーブルに変換できます。SQL構文は以下のとおりです:
ALTER TABLE table_name MODIFY PARTITION BY partition_option;
partition_option:
range_partition_option
| list_partition_option
| hash_partition_option
range_partition_option:
RANGE (column_name)
(PARTITION partition_name VALUES LESS THAN(expr)
[, PARTITION partition_name VALUES LESS THAN (expr) ...]
[, PARTITION partition_name VALUES LESS THAN (MAXVALUE)]
)
list_partition_option:
LIST (expr(column_name) | column_name)
(PARTITION partition_name VALUES ( v01 [, v0N])
[, PARTITION partition_name VALUES ( vN1 [, vNN]) ...]
[, PARTITION partition_name VALUES (DEFAULT)]
)
hash_partition_option:
HASH (expr(column_name) | column_name) PARTITIONS partition_count
パラメータ説明:
table_name:変更対象の非パーティションテーブルの名前。column_name:パーティションを指定する列の名前。partition_count:パーティション数を指定します。
テーブル構文の詳細なパラメータ説明については、ALTER TABLEを参照してください。
例:
非パーティションテーブル tbl1 を作成した後、Hashタイプのパーティションテーブルに変換します。
非パーティションテーブル
tbl1を作成します。obclient> CREATE TABLE tbl1(col1 INT, col2 DATE, PRIMARY KEY(col1, col2));非パーティションテーブル
tbl1をパーティションテーブルに変換します。obclient> ALTER TABLE tbl1 MODIFY PARTITION BY HASH(col1) PARTITIONS 4;
非パーティションテーブルからサブパーティションテーブルへの変換
非パーティションテーブルを、任意のパーティションタイプのテンプレート型または非テンプレート型のサブパーティションテーブルに変換できます。
非パーティションテーブルをテンプレート型サブパーティションテーブルに変換するSQL構文は以下のとおりです:
ALTER TABLE table_name MODIFY PARTITION BY partition_option;
partition_option:
RANGE(column_name) subpartition_option (range_partition_option)
| LIST(expr(column_name) | column_name) subpartition_option (list_partition_option)
| HASH(expr(column_name) | column_name) {(hash_partition_option)
| PARTITIONS partition_count}
subpartition_option:
SUBPARTITION BY
RANGE(column_name) SUBPARTITION TEMPLATE(range_subpartition_option)
| LIST(expr(column_name) | column_name) SUBPARTITION TEMPLATE(list_subpartition_option)
| HASH(expr(column_name) | column_name) {SUBPARTITION TEMPLATE (hash_subpartition_option)
| SUBPARTITIONS subpartition_count}
range_partition_option:
PARTITION partition_name VALUES LESS THAN(expr)
[, PARTITION partition_name VALUES LESS THAN(expr) ...]
[, PARTITION partition_name VALUES LESS THAN(MAXVALUE)]
range_subpartition_option:
SUBPARTITION subpartition_name VALUES LESS THAN(expr)
[, SUBPARTITION subpartition_name VALUES LESS THAN(expr) ...]
[, SUBPARTITION subpartition_name VALUES LESS THAN(MAXVALUE)]
list_partition_option:
PARTITION partition_name VALUES( v01 [, v0N])
[, PARTITION partition_name VALUES( vN1 [, vNN]) ...]
[, PARTITION partition_name VALUES(DEFAULT)]
list_subpartition_option:
SUBPARTITION subpartition_name VALUES(expr)
[, SUBPARTITION subpartition_name VALUES(expr) ...]
hash_partition_option:
PARTITION partition_name
[, PARTITION partition_name ...]
hash_subpartition_option:
SUBPARTITION subpartition_name
[, SUBPARTITION subpartition_name ...]
非パーティションテーブルを非テンプレート型サブパーティションテーブルに変換するSQL構文は以下のとおりです:
ALTER TABLE table_name MODIFY PARTITION BY partition_option;
partition_option:
RANGE(column_name) subpartition_option
{range_partition_option (subpartition_option_list)
[, range_partition_option (subpartition_option_list) ...]
}
| LIST(expr(column_name) | column_name) subpartition_option
{list_partition_option (subpartition_option_list)
[, list_partition_option (subpartition_option_list) ...]
}
| HASH(expr(column_name) | column_name) subpartition_option
{hash_partition_option (subpartition_option_list)
[, hash_partition_option (subpartition_option_list) ...]
}
subpartition_option:
SUBPARTITION BY
RANGE(column_name)
| LIST(expr(column_name) | column_name)
| HASH(expr(column_name) | column_name)
range_partition_option:
PARTITION partition_name VALUES LESS THAN(expr)
list_partition_option:
PARTITION partition_name VALUES(expr)
hash_partition_option:
PARTITION partition_name
subpartition_option_list:
range_subpartition_option
| list_subpartition_option
| hash_subpartition_option
range_subpartition_option:
SUBPARTITION subpartition_name VALUES LESS THAN(expr)
[, SUBPARTITION subpartition_name VALUES LESS THAN(expr) ...]
list_subpartition_option:
SUBPARTITION subpartition_name VALUES(expr)
[, SUBPARTITION subpartition_name VALUES(expr) ...]
hash_subpartition_option:
SUBPARTITION subpartition_name
[, SUBPARTITION subpartition_name ...]
テーブル構文を変更する詳細なパラメータ説明については、ALTER TABLEを参照してください。
例:
非パーティションテーブル tbl2 を作成した後、Hash + Range パーティションのテンプレート型サブパーティションテーブルに変換します。
非パーティションテーブル
tbl2を作成します。obclient> CREATE TABLE tbl2(col1 INT, col2 DATE, PRIMARY KEY(col1, col2));非パーティションテーブル
tbl2を Hash+ Range タイプのテンプレート型サブパーティションテーブルに変換します。obclient> ALTER TABLE tbl2 MODIFY PARTITION BY HASH(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN ('10-OCT-2016'), SUBPARTITION p2 VALUES LESS THAN ('30-MAR-2116') ) PARTITIONS 2;
パーティションタイプの変更
OceanBaseデータベースのOracleモードでは、ALTER TABLEコマンドを使用してパーティション属性を変更し、RangeパーティションテーブルとIntervalパーティションテーブル間で相互に変換できます。
使用上の制限
- 非パーティションテーブルはIntervalパーティションテーブルに変換できません。
- Rangeパーティションで値が
MAXVALUEを含む場合、Intervalパーティションに変換できません。 - テーブル作成時に定義されたInterval間隔(ステップサイズ)の変更は現在サポートされていません。
構文
ALTER TABLE table_name SET INTERVAL(expr);
パラメータの説明
パラメータ |
パラメータ説明 |
|---|---|
| table_name | 作成するテーブル名を指定します。 |
| table_definition | テーブルの列定義を指定します。 |
例
RangeパーティションからIntervalパーティションへの変換。
Rangeパーティションテーブル
test_tbl1を作成します。obclient> CREATE TABLE test_tbl1 (col1 VARCHAR2(30), col2 DATE NOT NULL) PARTITION BY RANGE (col2) ( PARTITION p0 VALUES LESS THAN(TO_DATE('2025-01-01', 'yyyy-mm-dd')) );テーブル
test_tbl1のパーティションをIntervalパーティションに変換し、パーティションのステップサイズを1ヶ月に設定します。obclient> ALTER TABLE test_tbl1 SET INTERVAL(NUMTOYMINTERVAL(1, 'month'));
IntervalパーティションからRangeパーティションへの変換。
Intervalパーティションテーブル
test_tbl2を作成し、パーティションのステップサイズを1ヶ月に設定します。obclient> CREATE TABLE test_tbl2(col1 VARCHAR2(30), col2 DATE NOT NULL) PARTITION BY RANGE (col2) INTERVAL(NUMTOYMINTERVAL(1, 'month')) ( PARTITION p0 VALUES LESS THAN(TO_DATE('2025-01-01', 'yyyy-mm-dd')) );テーブル
test_tbl2のパーティションをRangeパーティションに変換します。obclient> ALTER TABLE test_tbl2 SET INTERVAL();
パーティションキーの変更
OceanBaseデータベースのOracleモードでは、パーティションテーブルのパーティションキーを変更することは現在サポートされていません。