注意事项
本文要求PolarDB-X实例版本必须为5.4.14-16539836及以上;
若要对二级分区进行合并操作,要求PolarDB-X实例版本必须为5.4.17-16952556及以上。
对于非list/list column策略的分区表,只能合并相邻分区。
名词解释
表组:分区列完全相同的一组逻辑表或全局索引表的集合。
全局索引:使用另一个维度进行水平分区的数据与主表始终保持强一致的分区表。
语法
ALTER { TABLE tbl_name | TABLEGROUP tg_name | TABLEGROUP BY TABLE tbl_name }
merge_partition_specs_definition
| merge_subpartition_specs_definition
merge_partition_specs_definition:
MERGE PARTITIONS part_name,part_name[,part_name,...,part_name] TO new_part_name
merge_subpartition_specs_definition:
MERGE SUBPARTITIONS subpart_name,subpart_name[,subpart_name,...,subpart_name] TO new_subpart_name
其中ALTER TABLEGROUP BY TABLE tbl_name
是根据表名[db_name.]tbl_name自动查找目标表的表组tg_name进行表组级的分区合并,语义上与给定具体表组名的SQL:ALTER TABLEGROUP tg_name
进行操作是一样的。
场景1:目标分区是不含二级分区的一级分区
对于离散分区(list/list column策略),合并多个分区后,新分区的values取合并前多个分区的values的合集;对于连续空间的分区(range/range column/hash/key),合并多个相邻分区后,新分区的哈希空间取合并前的相邻分区中哈希空间最大的一个。
当子分区是非模板化分区时,合并后的新分区只有一个子分区,该子分区的空间是待合并分区的所有子分区的并集。对于离散的子分区(list/list column),取所有的value集合;对于连续空间的子分区,取所有子分区的最大空间。
Range/Range column分区表分区合并
可以将两个或两个以上的多个相邻的分区合并成一个新分区。
表级用法
假设表tb1的定义为:
CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
(PARTITION p1 VALUES LESS THAN(20),
PARTITION p2 VALUES LESS THAN(100),
PARTITION p3 VALUES LESS THAN(200))
执行以下SQL可以将p1、p2合并成一个新分区p12(但不能将p1和p3合并,它们不是连续的相邻分区)。
ALTER TABLE tb1 MERGE PARTITIONS p1,p2 TO p12
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步的合并。
假设表tb1、tb2的分区定义一致,且在一个表组mytg1(名字唯一即可,示例中全部以mytg1为例):
create tablegroup mytg1;
CREATE TABLE tb1(a int) PARTITION BY RANGE(a)
(PARTITION p1 VALUES LESS THAN(20),
PARTITION p2 VALUES LESS THAN(100)) tablegroup=mytg1;
CREATE TABLE tb2(a int) PARTITION BY RANGE(a)
(PARTITION p1 VALUES LESS THAN(20),
PARTITION p2 VALUES LESS THAN(100)) tablegroup=mytg1;
执行以下SQL将表组mytg1的p1、p2合并成一个新分区p12(意味着tb1和tb2的分区p1、p2会同步的合并成一个新分区p12):
ALTER TABLEGROUP mytg1 MERGE PARTITIONS p1,p2 TO p12
List/List column 分区表分区合并
对于list/list column分区策略,可以将任意两个或者多个分区合并成一个新分区,合并后新分区的VALUES取合并前多个分区的value集合。
表级用法
假设表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、p3合并成一个新分区p13:
ALTER TABLE tb1 MERGE PARTITION p1,p3 TO p13;
--合并后 p13的values 取p1和p3的values合集 (1, 2, 3, 4, 5, 6) U (default) = (default)
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步合并。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
Hash/key分区表分区合并
表级用法
假设表tb1的定义为:
CREATE TABLE tb1(a int) PARTITION BY key(a) partitions 3;
默认的这三个分区的名字依次是p1、p2、p3。
执行以下SQL将p1、p2合并成一个新分区p12(但不能将p1和p3合并,它们不是连续的相邻分区):
ALTER TABLE tb1 MERGE PARTITIONS p1,p2 TO p12
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步合并。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
场景2:目标分区是含有二级分区的一级分区
对于一级分区,如果是离散分区(list/list column策略),合并多个分区后,新分区的values取合并前多个分区的values的合集;对于连续空间的分区(range/range column/hash/key),合并多个相邻分区后,新分区的哈希空间取合并前的相邻分区中哈希空间最大的一个。
当前表的二级分区是模板化二级分区时,多个一级分区合并后,新分区的二级分区定义不变。
当前表的二级分区是非模板化二级分区时,多个一级分区合并后,新分区只保留一个二级分区,该二级分区的空间取所有待合并分区的所有子分区的合集,对于离散的二级分区(list/list column),取所有的values集合;对于连续的空间的二级分区,取所有子分区的中哈希空间最大的一个。
表级用法
对于二级分区是非模板化的表t1:
create table t1 (
a bigint unsigned not null,
b bigint unsigned not null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range columns (c,d)
(
partition p1
(
subpartition p1sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p1sp2 values less than ( maxvalue, maxvalue )
),
partition p2
(
subpartition p2sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p2sp2 values less than ( '2021-01-01', 'abc' ),
subpartition p2sp3 values less than ( '2022-01-01', 'abc' ),
subpartition p2sp4 values less than ( maxvalue, maxvalue )
),
partition p3
(
subpartition p3sp1 values less than ( '2019-01-01', 'abc' ),
subpartition p3sp2 values less than ( maxvalue, maxvalue )
),
partition p4
(
subpartition p4sp1 values less than ( '2020-01-01', 'abc' ),
subpartition p4sp2 values less than ( maxvalue, maxvalue )
)
);
将其p2、p3合并:
alter table t1 merge partitions p2,p3 to p23;
合并后p23的分区定义如下(二级分区名字可能会有所变化):
partition p23
(
subpartition sp1 values less than ( maxvalue, maxvalue )
),
对于二级分区是模板化的表t2:
create table t2 (
a bigint unsigned not null,
b bigint unsigned not null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range columns (c,d)
(
subpartition sp1 values less than ( '2020-01-01', 'abc' ),
subpartition sp2 values less than ( maxvalue, maxvalue )
);
将其p2、p3合并:
alter table t2 merge partitions p2,p3 to p23;
合并到p23表t2的模板二级分区没有发生变化。
表组级用法
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
场景3:目标分区是模板化的二级分区
如果模板二级分区是离散分区(list/list column策略),合并多个分区后,新分区的values取合并前多个分区的values的合集;对于连续空间的分区(range/range column/hash/key),合并多个相邻分区后,新分区的哈希空间取合并前的相邻分区中哈希空间最大的一个。
模板化二级分区是Range/Range column策略的分区表合并
表级用法
假设表tb1的定义为:
create table tb1 (
a bigint unsigned not null,
b bigint unsigned not null,
c bigint NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by range (c) (
subpartition sp1 values less than ( 1000 ),
subpartition sp2 values less than ( 2000 ),
subpartition sp3 values less than ( maxvalue )
);
执行以下SQL将sp1、sp2合并成sp12:
alter table tb1 merge subpartitions sp1,sp2 to sp12
合并后sp12的分区定义为:
subpartition sp12 values less than ( 2000 )
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步合并。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
模板化二级分区是List/List column策略的分区表合并
表级用法
假设表tb1的定义为:
create table tb1 (
a bigint unsigned not null,
b bigint unsigned not null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (a,b) partitions 4
subpartition by list (to_days(c)) (
subpartition sp1 values in ( to_days('2020-01-01'),to_days('2020-02-01')),
subpartition sp2 values in ( to_days('2020-03-01'),to_days('2020-04-01') ),
subpartition sp3 values in ( to_days('2020-05-01'),to_days('2020-06-01') ),
subpartition sp4 values in ( default )
);
执行以下SQL将sp1、sp3合并成sp13:
alter table tb1 merge subpartitions sp1,sp3 to sp13
合并和sp13的分区定义为:
subpartition sp13 values in ( to_days('2020-01-01'),to_days('2020-02-01'),to_days('2020-05-01'),to_days('2020-06-01') ),
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步合并。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
模板化二级分区是Hash/key策略的分区表合并
表级用法
假设表tb1的定义为:
create table tb1 (
a bigint unsigned not null,
b bigint unsigned not null,
c datetime NOT NULL,
d varchar(16) NOT NULL,
e varchar(16) NOT NULL
)
partition by key (c,d) partitions 3
subpartition by key (a,b) subpartitions 3;
默认的一级分区的名字依次是p1、p2、p3,模板子分区的名称依次是sp1、sp2、sp3。
执行以下SQL将sp1、sp2合并成sp12:
alter table tb1 merge subpartitions sp1,sp2 to sp12
表组级用法
对表组的分区进行合并,意味着表组内所有表的相应分区会同步合并。
和表级类似,仅需将语法规则alter table #tb
改成alter tablegroup #tgname
或alter tablegroup by #tb
。
场景4:目标分区是非模板化的二级分区
场景3中对应的分区策略的实例,同样适应于场景4,具体合并语法请参见场景3:目标分区是模板化的二级分区。