关键字:
range分区,list分区,hash分区、人大金仓、KingbaseES
1. 拆分分区的概念
分区表是数据库中的一种表设计方式,它将表的数据分割成多个,称之为分区的逻辑存
储单元。每个分区可以独立管理,包括存储、备份、维护和查询,从而提高了更高效的数据管理和查询性能。
通俗来说,就是当表中的数据不断地增大时,查询速度就会变得非常慢,应用程序的性能就就会下降,这个时候就应该考虑对表进行分区。表进行分区以后,逻辑上仍然是一张完整的表,只是将表里的数据在物理上存放到多个表空间中,这样在查询数据时,就不用每次查询都进行整张表的扫描,提高了查询速度。
拆分分区是指将一个现有的分区进一步划分成多个子分区的操作。通常来说,这是为了进一步更好的管理数据,以便将大分区拆分为更小的部分,以适应增长的大数据量。
2. 为什么要拆分分区
- 性能提升:当一个分区中的数据量持续增长,可能会影响查询性能的和数据维护的时候,拆分分区可以将大分区划分成较小的子分区,以改善性能。
- 数据管理:拆分分区可以更好的管理数据,使其组织更加合理,降低数据的碎片化程度
3、拆分分区
3.1 范围分区表
(1)拆分分区表和合并分区表的要求与书写方式有很大的不同,同样的,与合并分区的语法一样,也有着许多不同的写法,下面将着重介绍一下在range分区内拆分分区语法的书写。
ALTER TABLE split_partition SPLIT PARTITION p2 AT(15) INTO (PARTITION p2_a,PARTITION p2_b);
这是范围分区表拆分分区中最常见的写法,其中AT括号内的数字就是拆分完的两个分区的边界点,例如,这个分区原来的范围是11-20,那么拆分完后,范围就是11-14与15-20。
(2)那么此时,针对这种写法还有一个变式,如下所示
ALTER TABLE split_partition3 SPLIT PARTITION FOR (10) AT(15) INTO (PARTITION p2_a,PARTITION p2_b);
可以将上面的p3分区的名字来替换为FOR(任意一个插入在此分区内的数值),可以用这个来代替前面书写的分区名,二者具有相同的效力。
(3)除此之外,AT括号内的数值,还可以用表达式来替代,如下所示
ALTER TABLE split_partition SPLIT PARTITION p2 AT(3*5) INTO (PARTITION p2_a,PARTITION p2_b);
可以用表达式3*5来替代原来的15,都是具有同等效力的。
(4)上面的三种书写方法,无一例外都是针对只需要将被拆分分区分为两个的分区的书写方法,而且只能是两个。如果需要将分区拆分为大于等于3个分区的情况,需要用到如下写法。
ALTER TABLE split_partition3 SPLIT PARTITION p3 INTO (PARTITION p2_a VALUES LESS THAN(25), PARTITION p2_b VALUES LESS THAN(28),PARTITION p3_c);
此时,省略AT字眼,直接使用into,并在括号内定义分区的取值范围,这里有一个 特别注意的地方,无论在括号内写了多少个子分区,最后一个子分区都只可以写partition和分区名,不可以添加分区范围的字眼,否则会报错。
3.2 列表分区
列表分区的拆分语法和范围分区相似,也可以用上面的四种方法来书写,但是要注意,对列表分区进行拆分的时候,需要保证拆分前的分区至少包含两个或者两个以上的分区值,方便后期进行拆分。
例如原来有分区定义如下
PARTITION p1 VALUES (1,3,5),
拆分一:
ALTER TABLE split_list_partition1 SPLIT PARTITION p1 VALUES(1,3) INTO
(PARTITION p2_a,PARTITION p2_b);
这里用values来替代at,此时values里面的数字代表着前面的一个分区将要拥有的分区值,那么没有出现在括号里面的数值就是下一个分区的分区值了,上面案例中的5就是第二个分区被分配的分区值。
拆分二:
ALTER TABLE split_list_partition2 SPLIT PARTITION FOR(3) VALUES(1,3) INTO (PARTITION p1_a,PARTITION p1_b);
拆分三:当需要拆分为多个分区时,书写如下:
ALTER TABLE split_list_partition2 SPLIT PARTITION p1 INTO
(PARTITION p2_a VALUES (1),PARTITION p2_b VALUES (3),PARTITION p2_c);
这里与range分区一样,最后一个分区也不能写具体的拆分范围,只能写分区名和分区关键字。
3.3 hash分区
与合并分区内容一样,hash分区也不支持拆分分区
4、复合分区
在复合分区中,其实拆分与合并的逻辑几乎都是差不多的,下面将介绍一下复合分区的概念。
常见的复合分区包含range、list、hash三种分区的排列组合,一共9种复合分区,复合分区的父分区与子分区之间创建的分区互相不影响,但是父分区与子分区定义的分区键不可以相同。
CREATE TABLE range_range_tab1(
i NUMBER,
j NUMBER,
f VARCHAR2(20),
k VARCHAR2(20)
)PARTITION BY RANGE(i)
SUBPARTITION BY RANGE (j)
(
PARTITION p1 VALUES LESS THAN(10),
PARTITION p2 VALUES LESS THAN(20),
PARTITION p3 VALUES LESS THAN(30)
(
SUBPARTITION p3_p1 VALUES LESS THAN(10),
SUBPARTITION p3_p2 VALUES LESS THAN(20),
SUBPARTITION p3_p3 VALUES LESS THAN(MAXVALUE)
),
PARTITION p4 VALUES LESS THAN(40)
(
SUBPARTITION p4_p1 VALUES LESS THAN(10),
SUBPARTITION p4_p2 VALUES LESS THAN(20),
SUBPARTITION p4_p3 VALUES LESS THAN(30),
SUBPARTITION p4_p4 VALUES LESS THAN(40),
SUBPARTITION p4_p5 VALUES LESS THAN(MAXVALUE)
),
PARTITION p5 VALUES LESS THAN(50),
PARTITION p6 VALUES LESS THAN(60),
PARTITION p7 VALUES LESS THAN(MAXVALUE)
);
这就是常见的range-range类型的复合分区的定义方法,其实书写格式与普通的分区没什么差别,就是将分区进行了一个简单的嵌套,组合成了二级分区。
4.1复合分区的合并
这里需要详细说一下在复合分区的合并中,一些常见的注意事项
- 不同父分区之间的子分区是无法进行合并的,这就相当于跨越分区合并,这在一级分区内也是不允许的。
- 父分区之间的合并规则与同一父分区之间的子分区之间的合并规则与相同情况下的一级分区之间合并的规则是相同的,请参考《分区表超详细教程(一)》。
复合分区父分区之间合并时子分区的变化:
- range-range类型中,如果不同的父分区之间进行合并,那么他们原先各自拥有的子分区,将会消失不见,变为一个大的子分区,取值范围为minvalue-maxvalue。
- range-list类型中,原来的两个父分区之间的子分区也会全部消失,将会生成一个默认的子分区,取值范围为default。
- range-hash类型中,与上面的一样,原来两个福分区之间的子分区会全部消失,会出现一个默认分区来代表这个分区仍然是一个二级分区
- 在其他类型的复合分区中,子分区的变化也如上面三种子分区的变化一样,如出一辙,会生成一个默认子分区来维护它仍然是一个二级分区的身份。
这是常规情况下的复合分区之间的合并的状态,当采用分区模板进行定义的时候,情况又不一样了。如下所示案例
CREATE TABLE range_list_tab1(
i NUMBER,
j NUMBER,
f VARCHAR2(20),
k VARCHAR2(20)
)PARTITION BY RANGE(i)
SUBPARTITION BY LIST (j)
SUBPARTITION TEMPLATE
(
SUBPARTITION p1 VALUES (1),
SUBPARTITION p2 VALUES (2),
SUBPARTITION p3 VALUES (3),
SUBPARTITION p4 VALUES (4),
SUBPARTITION p5 VALUES (5)
)
(
PARTITION p1 VALUES LESS THAN(11),
PARTITION p2 VALUES LESS THAN(21),
PARTITION p3 VALUES LESS THAN(31),
PARTITION p4 VALUES LESS THAN(41),
PARTITION p5 VALUES LESS THAN(MAXVALUE)
);
当对p1和p2进行合并的时候,他们之间的原有的子分区并不会像普通复合分区一样全部消失,而是子分区模板仍然是子分区模板的样式,合并后的父分区的子分区仍然和子分区模板一样,如下图所示
4.2 复合分区拆分
当涉及到复合分区拆分的 ,规则就比合并的时候要简单许多了。
- 当对子分区进行拆分的时候,会非常常规的进行子分区拆分,并生成三级子分区,拆分规则和单级分区拆分规则是一样的
- 当对复合分区的父分区进行拆分的时候,那么原先的父分区会被拆分成两个,并且原来的父分区下面的子分区也会同时变成好几份一模一样的子分区附属到新的父分区下面,并不会有实质性的变化。
如下图所示,p4是被拆分的分区,ps4a和ps4b是新的拆分的分区。
参考资料
《KingbaseES SQL语言参考手册》




