パーティションテーブルを作成した後、そのパーティションテーブルにパーティションを追加できます。
パーティションテーブルにおけるパーティション追加操作のサポート状況
OceanBaseデータベースのMySQLモードでは、パーティションテーブルとコンポジット・パーティションテーブルに対するパーティション追加操作の具体的なサポート状況は以下の表のとおりです。
| パーティションテーブル | パーティションタイプ | パーティションの追加 | サブパーティションの追加 |
|---|---|---|---|
| パーティションテーブル |
|
サポート | - |
| パーティションテーブル |
|
サポートなし | - |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポート | サポート |
| サブパーティションテーブル |
|
サポート | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
| サブパーティションテーブル |
|
サポートなし | サポート |
| サブパーティションテーブル |
|
サポートなし | サポートなし |
パーティションの追加
パーティションテーブル、テンプレート型サブパーティションテーブル、および非テンプレート型サブパーティションテーブルにパーティションを追加できます。
パーティションテーブルおよびテンプレート化されたコンポジット・パーティションテーブルにパーティションを追加する
パーティションテーブルおよびテンプレート化されたコンポジット・パーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION (partition_option);
partition_option:
{PARTITION partition_name VALUES LESS THAN range_partition_expr
[,PARTITION partition_name VALUES LESS THAN range_partition_expr]... }
|{PARTITION partition_name VALUES IN list_partition_expr
[,PARTITION partition_name VALUES IN list_partition_expr]...}
説明
Range/Range Columnsパーティションの場合、最大のパーティションの後にのみパーティションを追加でき、途中または先頭に追加することはできません。現在のパーティションに
MAXVALUEのパーティションがある場合、パーティションの追加はできません。List/List Columnsパーティションにパーティションを追加する際は、追加するパーティションが前のパーティションと競合しないことが求められます。List/List Columnsパーティションにデフォルトパーティション、すなわち
Default Partitionがある場合、パーティションを追加することはできません。Range/Range Columns/List/List Columnsパーティションにパーティションを追加しても、グローバルインデックスおよびローカルインデックスの使用には影響しません。
テンプレート化されたコンポジット・パーティションテーブルにパーティションを追加する場合、パーティションの定義のみを指定する必要があり、対応するコンポジット・パーティションの定義はテンプレートに従って自動的に埋め込まれます。
一部の例は以下のとおりです:
Rangeパーティションテーブル
tbl1_rを作成し、パーティションM202106を追加します。obclient> CREATE TABLE tbl1_r (id INT NOT NULL,value varchar(50),time TIMESTAMP NOT NULL) PARTITION BY RANGE(UNIX_TIMESTAMP(time)) (PARTITION M202101 VALUES LESS THAN(UNIX_TIMESTAMP('2021/02/01')), PARTITION M202102 VALUES LESS THAN(UNIX_TIMESTAMP('2021/03/01')), PARTITION M202103 VALUES LESS THAN(UNIX_TIMESTAMP('2021/04/01')), PARTITION M202104 VALUES LESS THAN(UNIX_TIMESTAMP('2021/05/01')), PARTITION M202105 VALUES LESS THAN(UNIX_TIMESTAMP('2021/06/01')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r ADD PARTITION (PARTITION M202106 VALUES LESS THAN(UNIX_TIMESTAMP('2021/07/01'))); Query OK, 0 rows affectedListパーティションテーブル
tbl1_lを作成し、パーティションp2とp3を追加します。obclient> CREATE TABLE tbl1_l (col1 INT PRIMARY KEY,col2 VARCHAR(50)) PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1,2,3), PARTITION p1 VALUES IN (5,6) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_l ADD PARTITION (PARTITION p2 VALUES IN (7,8), PARTITION p3 VALUES IN (DEFAULT) ); Query OK, 0 rows affectedRange Columns + Range Columnsパーティションのテンプレート化されたパーティションテーブル
t_m_rcrcにパーティションp3とp4を追加します。obclient> CREATE TABLE t_m_rcrc(col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(1000), SUBPARTITION mp1 VALUES LESS THAN(2000), SUBPARTITION mp2 VALUES LESS THAN(3000) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) ); Query OK, 0 rows affected obclient> ALTER TABLE t_m_rcrc ADD PARTITION (PARTITION p3 VALUES LESS THAN(400), PARTITION p4 VALUES LESS THAN(500) ); Query OK, 0 rows affected
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加する
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加するSQL構文は以下のとおりです:
ALTER TABLE table_name ADD PARTITION (partition_option);
partition_option:
{PARTITION partition_name VALUES LESS THAN range_partition_expr (subpartition_option)
[,PARTITION partition_name VALUES LESS THAN range_partition_expr (subpartition_option)]... }
|{PARTITION partition_name VALUES IN list_partition_expr (subpartition_option)
[,PARTITION partition_name VALUES IN list_partition_expr (subpartition_option)]...}
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr, ...}
|{SUBPARTITION subpartition_name VALUES IN list_partition_expr, ....}
|{SUBPARTITION subpartition_name, ....}
説明
テンプレート化されていないセカンダリパーティションテーブルにパーティションを追加する場合、パーティションの定義とそのパーティション内のサブパーティションの定義を同時に指定する必要があります。
Range+Range型のテンプレート化されていないパーティションテーブルt_f_rclcにパーティションp2を追加する例を以下に示します:
obclient> CREATE TABLE t_f_rclc (col1 INT,col2 INT)
PARTITION BY RANGE COLUMNS(col1)
SUBPARTITION BY LIST COLUMNS(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES IN(1,3),
SUBPARTITION sp1 VALUES IN(4,6),
SUBPARTITION sp2 VALUES IN(7,9)),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp3 VALUES IN(1,3),
SUBPARTITION sp4 VALUES IN(4,6),
SUBPARTITION sp5 VALUES IN(7,9))
);
obclient> ALTER TABLE t_f_rclc ADD PARTITION
(PARTITION p2 VALUES LESS THAN(300)
(SUBPARTITION sp6 VALUES IN(1,3),
SUBPARTITION sp7 VALUES IN(4,6),
SUBPARTITION sp8 VALUES IN(7,9))
);
Query OK, 0 rows affected
サブパーティションの追加
注意
- HashまたはKeyタイプのサブパーティションを追加することはサポートされていません。
- OceanBaseデータベースV4.3.5では、V4.3.5 BP1バージョンからサブパーティションの追加がサポートされます。
- 追加するサブパーティション名は、テーブル内に既存するパーティション名と重複してはなりません。
- Rangeタイプのサブパーティションを追加する場合、Rangeの上限値は現在のパーティションの最大値より大きくなければなりません。複数のRangeタイプのサブパーティションを追加する場合、上限値は増加順に並べ替える必要があります。つまり、上限値が大きいRangeパーティションは後方に配置します。
- Listタイプのサブパーティションを追加する場合、現在のパーティションに既存するサブパーティションの値と重複してはなりません。
- 複数のサブパーティションを追加する操作は原子性を持ち、すべて成功するか、すべて失敗するかのどちらかです。
構文
ALTER TABLE table_name MODIFY PARTITION partition_name
ADD SUBPARTITION (subpartition_option);
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr
[, SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr] ...}
| {SUBPARTITION subpartition_name VALUES IN list_partition_expr
[, SUBPARTITION subpartition_name VALUES IN list_partition_expr] ...}
パラメータの説明
| パラメータ | 説明 |
|---|---|
| table_name | テーブル名を指定します。 |
| partition_name | 追加するサブパーティションが属するパーティションの名前を指定します。 |
| subpartition_name | 追加するサブパーティションの名前を指定します。 |
| subpartition_option | 新規追加するサブパーティションの定義を示します。 |
| range_partition_expr | Range/Range Columnsパーティション式を示します。 |
| list_partition_expr | List/List Columnsパーティション式を示します。 |
例
Range + Rangeパーティションテーブルにサブパーティションテーブルを追加します。
Range + Rangeパーティションのテンプレート型サブパーティションテーブル
tbl1_m_rrを作成します。CREATE TABLE tbl1_m_rr (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION p0 VALUES LESS THAN (1000), SUBPARTITION p1 VALUES LESS THAN (2000)) (PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200));テーブル
tbl1_m_rrのパーティションp1にサブパーティションp1sp2を追加します。ALTER TABLE tbl1_m_rr MODIFY PARTITION p1 ADD SUBPARTITION (SUBPARTITION p1sp2 VALUES LESS THAN (3000));
Range + Range非テンプレート型パーティションテーブルにサブパーティションテーブルを追加します。
Range + Rangeパーティションの非テンプレート型サブパーティションテーブル
tbl2_f_rrを作成します。CREATE TABLE tbl2_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) ) );テーブル
tbl2_f_rrのパーティションp1にサブパーティションsp5とsp6を追加します。ALTER TABLE tbl2_f_rr MODIFY PARTITION p1 ADD SUBPARTITION (SUBPARTITION sp5 VALUES LESS THAN(2023), SUBPARTITION sp6 VALUES LESS THAN(2024));