分区合并
PolarDB-X支持将多个分区(两个或者两个以上)合并成一个分区,对于Hash、Key、Range或Range column分区,只能将相邻的分区合并,对于List或List column分区,可以将任意分区合并在一起。
- 语法
ALTER TABLE identifier MERGE PARTITIONS partition_name,...,partition_name TO partition_name; - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(40), PARTITION p3 VALUES LESS THAN(100))执行以下SQL,将p1和p2合并:
ALTER TABLE tb1 MERGE PARTITIONS p1,p2 to p12说明
对于Hash、Key、Range或Range column分区,不支持将不相邻的两个分区合并,例如p1和p3合并到一起。
分区迁移
将分区迁移到指定的存储节点。
- 语法
ALTER TABLE identifier MOVE PARTITIONS partition_name[,partition_name,...] TO dn_id - 示例
执行以下SQL创建tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(40), PARTITION p3 VALUES LESS THAN(100))执行以下SQL,将p1、p3迁移到指定的存储节点DN2(其中DN2是存储节点的ID)中:
ALTER TABLE tb1 MOVE PARTITIONS p1,p3 to 'DN2';
增加分区
对于Range或Range column分区表,如果最后一个分区不是catch-all分区(即不是values less than (MAXVALUE)定义的分区),支持在最后一个分区后增加新分区。
对于List或List column分区表,如果原分区不包括default分区(即不包括values in (default)定义的分区),支持添加新的分区。
对于key或hash分区,不支持动态的增加分区。
对于以上提到的Range或Range column(不包含catch-all分区)、List或List column分区(不包括default分区),可以通过以下语法增加一个或多个分区:
- 语法
ALTER TABLE identifier ADD PARTITION (partition_definition [,partition_definition] ...) - 示例
执行以下SQL,创建Range分区表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(40))执行以下SQL,给tb1增加两个分区:
ALTER TABLE tb1 ADD PARTITION (PARTITION p3 VALUES LESS THAN(60), PARTITION p4 VALUES LESS THAN(80))
删除分区
对于分区策略为Range、Range column、List或List column的分区,支持动态的删除分区。
- 语法
ALTER TABLE identifier DROP PARTITION partitiion_name [,partition_name] ... - 示例
执行以下SQL,创建Range分区表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(40), PARTITION p3 VALUES LESS THAN(60))通过以下SQL删除p3分区:
ALTER TABLE tb1 DROP PARTITION p3
重命名分区
通过以下语法对现有的分区名进行重命名。
- 语法
ALTER TABLE identifier RENAME PARTITION old_part_name to new_part_name[, old_part_name to new_part_name] - 示例
执行以下SQL,创建Range分区表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(40), PARTITION p3 VALUES LESS THAN(60))执行以下SQL,将p2、p3重命名为p20、p30:
ALTER TABLE tb1 RENAME PARTITION p2 to p20, p3 to p30
修改分区值
对于分区策略为List或List column的分区表,支持通过以下语法修改分区值。
- 语法
ALTER TABLE identifier MODIFY PARTITION partition_name ADD/DROP VALUES (value_list) - 示例
执行以下SQL,创建List分区表tb1:
CREATE TABLE tb1(a int) PARTITION BY List(a) (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6), PARTITION p2 VALUES IN(7,8,9), PARTITION p3 VALUES IN(10,11,12))执行以下SQL将9从p2中删除,给p3增加两个分区值:
ALTER TABLE tb1 MODIFY PARTITION p2 DROP VALUES(9); ALTER TABLE tb1 MODIFY PARTITION p2 ADD VALUES(13,14);
关于全局二级索引
以上的所有操作同样适用于全局二级索引表,只需要将表名替换为全局二级索引的逻辑名字。
示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1(a int,b int, global index g1(b) partition by key(b) partitions 3)
PARTITION BY RANGE(a)
(PARTITION p1 VALUES LESS THAN(20),
PARTITION p2 VALUES LESS THAN(40),
PARTITION p3 VALUES LESS THAN(60))tb1有一个全局二级索引,名字是g1,它的逻辑名字是tb1.g1,执行以下SQL将tb1.g1的分区p1做分裂操作:
ALTER TABLE tb1.g1 SPLIT PARTITION p1



