本文介绍了修改表的分区的语法,包括分区的分裂、合并和迁移等。本语法仅适用于AUTO模式数据库。
分区分裂
将表的一个分区分裂成一个或多个分区。
Range/Range column分区表分裂- 语法
ALTER TABLE identifier SPLIT PARTITION identifier INTO (partition_definition,partition_definition, [, partition_definition] ...); partition_definition: PARTITION partition_name [VALUES {LESS THAN {(value_list) | MAXVALUE}] - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(100))执行以下SQL,将p1分裂成p10,p11,p12:
ALTER TABLE tb1 SPLIT PARTITION p1 INTO (PARTITION p10 VALUES LESS THAN (8), PARTITION p11 VALUES LESS THAN(15), PARTITION p12 VALUES LESS THAN(20))
对于Range分区表,PolarDB-X还支持将一个Range在其范围内按任意点一分为二。
- 语法
ALTER TABLE identifier SPLIT PARTITION identifier AT(number) INTO (PARTITION identifier, PARTITION identifier); - 示例
对于tb1表,支持将分区p1分裂:
ALTER TABLE tb1 SPLIT PARTITION p1 AT(9) INTO (partition p11, partition p12)该SQL等价于下面这条语句:
ALTER TABLE tb1 SPLIT PARTITION p1 INTO (PARTITION p11 VALUES LESS THAN(9), PARTITION p12 VALUES LESS THAN(20));
- 语法
ALTER TABLE identifier SPLIT PARTITION identifier INTO (partition_definition,partition_definition, [, partition_definition] ...); partition_definition: PARTITION partition_name [VALUES IN (value_list | default)}] - 示例
执行以下SQL,创建表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(default))执行以下SQL,将p1分裂成p10,p11,p12。
ALTER TABLE tb1 SPLIT PARTITION p1 INTO (PARTITION p10 VALUES IN (1,3,5), PARTITION p11 VALUES IN (2,4), PARTITION p12 VALUES IN (6))由于分区p3是default分区,表示1~9之外的分区键对应的值全部在p3分区。对于default分区,PolarDB-X也支持将部分value从default分区中分裂出来。执行以下SQL,将10~15从p3中分裂出来:
ALTER TABLE tb1 SPLIT PARTITION p3 INTO (PARTITION p30 VALUES IN (10,11,12), PARTITION p31 VALUES IN (13,14,15), PARTITION p32 VALUES IN (default))
- 语法
ALTER TABLE identifier SPLIT PARTITION identifier - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3;默认的这三个分区的名字依次是p1,p2,p3,可以通过以下语法,将p1分裂成两个分区,这两个新分区是在原p1的hash空间范围内将其按hash空间范围一分为二:
ALTER TABLE tb1 SPLIT PARTITION p1;
对于Key分区的表,如果发现有热点数据(数据倾斜),PolarDB-X支持将热点的数据散列到多个分区。
- 语法
ALTER TABLE identifier SPLIT INTO [newPartNamePrefix] PARTITIONS partition_count BY HOT VALUE(value_list); - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1 (seller_id int, order_id int) PARTITION BY key (seller_id, order_id) PARTITIONS BY 3;假如seller_id=88是个大卖家ID,对应的数据非常多,执行以下SQL将seller_id=88的数据散列到5个新的分区:hp1,hp2,hp3,hp4,hp5,这5个分区是按照seller_id=88所对应的order_id的hash空间五等份切分。
ALTER TABLE tb1 SPLIT INTO hp PARTITIONS 5 BY HOT VALUE(88);
对于Key分区的表,PolarDB-X支持将热点值对应的数据提取到一个单独的分区。
- 语法
ALTER TABLE identifier EXTRACT TO PARTITION [newPartNamePrefix] BY HOT VALUE(value_list); - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1 (a int, b int) PARTITION BY key(a, b) PARTITIONS BY 3;执行以下SQL,将拆分键值为
(a=88,b=10)的数据,提取到一个单独的新分区:ALTER TABLE tb1 EXTRACT TO PARTITION BY HOT VALUE(88,10);
对于List或List column分区,PolarDB-X也支持将特定的value对应的数据提取到一个单独的分区。
- 语法
ALTER TABLE identifier EXTRACT TO PARTITION pnew BY [HOT] VALUE(value_list); - 示例
执行以下SQL,创建表tb1:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a) (PARTITION p1 VALUES IN(1, 2, 3, 4, 5, 6), PARTITION p2 VALUES IN(7,8,9), PARTITION p3 VALUES IN(default))执行以下SQL,将value=2提取到一个单独分区:
ALTER TABLE tb1 EXTRACT TO PARTITION pnew BY HOT VALUE(2);




