パーティションテーブルを作成した後、そのパーティションテーブルにパーティションを追加できます。
パーティションテーブルにおけるパーティション追加操作のサポート状況
OceanBaseデータベースのOracleモードでは:
プライマリパーティションテーブルについては、現在RangeパーティションとListパーティションに対するパーティション追加操作のみがサポートされており、Hashパーティションへの追加操作はまだサポートされていません。
セカンダリパーティションテーブルについては、現在RangeパーティションとListパーティション(組み合わせ)に対するパーティション追加操作のみがサポートされています。
OceanBaseデータベースのOracleモードにおける、プライマリパーティションテーブルとセカンダリパーティションテーブルのパーティション追加操作の具体的なサポート状況は、以下の表のとおりです。
| パーティションテーブル | パーティションタイプ | パーティションの追加 | サブパーティションの追加 |
|---|---|---|---|
| パーティションテーブル | Range / List | サポート | - |
| パーティションテーブル | Hash | サポートなし | - |
| サブパーティションテーブル | Range + Range / Range + List | サポート | サポート |
| サブパーティションテーブル | Range + Hash | サポート | サポートなし |
| サブパーティションテーブル | List + Range / List + List | サポート | サポート |
| サブパーティションテーブル | List + Hash | サポート | サポートなし |
| サブパーティションテーブル | Hash + Range / Hash + List | サポートなし | サポート |
| サブパーティションテーブル | Hash + Hash | サポートなし | サポートなし |
パーティションの追加
パーティションテーブル、テンプレート型サブパーティションテーブル、および非テンプレート型サブパーティションテーブルにパーティションを追加できます。
パーティションテーブルおよびテンプレート化されたコンポジット・パーティションテーブルにパーティションを追加する
パーティションテーブルおよびテンプレート化されたコンポジット・パーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION partition_option;
partition_option:
range_partition_option | list_partition_option
range_partition_option:
partition_name VALUES LESS THAN partition_expr
list_partition_option:
partition_name VALUES partition_expr
説明
Rangeパーティションの場合、最大のパーティションの後にのみパーティションを追加でき、途中または先頭にパーティションを追加することはできません。現在のパーティションに
MAXVALUEのパーティションがある場合、さらにパーティションを追加することはできません。Listパーティションにパーティションを追加する際は、追加するパーティションが既存のパーティションと競合しないことが求められます。Listパーティションにデフォルトパーティション、すなわち
Default Partitionがある場合、どのパーティションも追加できません。Range/Listパーティションにパーティションを追加しても、グローバルインデックスおよびローカルインデックスの使用に影響はありません。
テンプレート化されたコンポジット・パーティションテーブルの場合、パーティションを追加する際はパーティションの定義のみを指定する必要があり、コンポジット・パーティションの定義はテンプレートに従って自動的に埋め込まれます。
一部の例は以下のとおりです:
Rangeパーティションを持つパーティションテーブル
tbl1_rを作成し、パーティションM202006を追加します。obclient> CREATE TABLE tbl1_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r ADD PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD')); Query OK, 0 rows affectedListパーティションを持つパーティションテーブル
tbl1_lを作成し、パーティションp4を追加します。obclient> CREATE TABLE tbl1_l(log_id INT,log_value VARCHAR2(20)) PARTITION BY LIST(log_value) (PARTITION p1 VALUES ('A'), PARTITION p2 VALUES ( 'B' ), PARTITION p3 VALUES ( 'C' ) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_l ADD PARTITION p4 VALUES('D'); Query OK, 0 rows affectedRange + Rangeパーティションを持つテンプレート化されたコンポジット・パーティションテーブル
t2_m_rrを作成し、その後パーティションp2を追加します。obclient> CREATE TABLE t2_m_rr(col1 INT,col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(2020), SUBPARTITION mp1 VALUES LESS THAN(2021), SUBPARTITION mp2 VALUES LESS THAN(2022) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200) ); Query OK, 0 rows affected obclient> ALTER TABLE t2_m_rr ADD PARTITION p2 VALUES LESS THAN(300); Query OK, 0 rows affected
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加する
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION partition_option (subpartition_option);
partition_option:
range_partition_option | list_partition_option
range_partition_option:
partition_name VALUES LESS THAN partition_expr
list_partition_option:
partition_name VALUES partition_expr
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr, ...}
|{SUBPARTITION subpartition_name VALUES list_partition_expr, ....}
|{SUBPARTITION subpartition_name, ....}
説明
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加する場合、パーティションの定義とそのパーティション内のサブパーティションの定義を同時に指定する必要があります。
Range + Rangeパーティションを持つテンプレート化されていないセカンダリパーティションテーブルt2_f_rrを作成し、さらにパーティションp2を追加する例は以下のとおりです:
obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(2020),
SUBPARTITION sp1 VALUES LESS THAN(2021)
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES LESS THAN(2020),
SUBPARTITION sp3 VALUES LESS THAN(2021),
SUBPARTITION sp4 VALUES LESS THAN(2022)
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t2_f_rr ADD PARTITION p2 VALUES LESS THAN(300)
(SUBPARTITION sp5 VALUES LESS THAN(2020),
SUBPARTITION sp6 VALUES LESS THAN(2021),
SUBPARTITION sp7 VALUES LESS THAN(2022)
);
Query OK, 0 rows affected
サブパーティションの追加
OceanBaseデータベースのOracleモードは、現在テンプレート化されていないサブパーティションテーブルにのみサブパーティションを追加することをサポートしています。
構文
ALTER TABLE table_name MODIFY PARTITION partition_name ADD subpartition_list;
subpartition_list:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr, ...}
| {SUBPARTITION subpartition_name VALUES list_partition_expr, ...}
パラメータの説明
| パラメータ | 説明 |
|---|---|
| table_name | テーブル名を指定します。 |
| partition_name | 追加するサブパーティションが属するパーティションの名前を指定します。 |
| subpartition_name | 追加するサブパーティションの名前を指定します。 |
例
Range + Rangeパーティションを持つ非テンプレート化サブパーティションテーブルt2_f_rrを作成し、さらにパーティションp1にサブパーティションsp5とsp6を追加します。
obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(2020),
SUBPARTITION sp1 VALUES LESS THAN(2021)
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES LESS THAN(2020),
SUBPARTITION sp3 VALUES LESS THAN(2021),
SUBPARTITION sp4 VALUES LESS THAN(2022)
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t2_f_rr MODIFY PARTITION p1 ADD
SUBPARTITION sp5 VALUES LESS THAN(2023),
SUBPARTITION sp6 VALUES LESS THAN(2024);
Query OK, 0 rows affected