支持二级分区
功能描述
二级分区功能,即可以在原有的range、list、hash分区的基础上再次进行分区。
二级分区可以对表中的每个分区再次进行分区。分区类型有range、list、hash三种,一级与二级分区的分区类型可以任意组合。二级分区可以支持CREATE/ALTER/SELECT语法,用于二级分区的创建与增删改查。二级分区的相关信息可在系统表pg_partition中获取。
语法格式
创建二级分区表语法及相关参数说明请参考CREATE TABLE SUBPARTITION。
二级分区的增删改查
对二级分区表插入数据的语法与普通表的语法没有任何差别,当向二级分区表插入数据时,会根据一级分区和二级分区规则,把数据分布到匹配的二级分区中进行存储。
新增一级与二级分区:
ALTER TABLE table_name ADD partition_desc [ ( subpartition_desc [, ... ] ) ]
删除指定一级分区包括属于它的所有二级分区:
ALTER TABLE table_name DROP PARTITION { partition_name | { FOR ( value [ , … ] ) }
为指定一级分区新增二级分区:
ALTER TABLE table_name MODIFY PARTITION partition_name ADD subpartition_desc
删除指定二级分区:
ALTER TABLE table_name DROP SUBPARTITION { subpartition_name | { FOR ( value [ , … ] ) }
删除数据:
DELETE FROM table_name [ PARTITION { ( partition_name ) | { FOR ( value [ , ... ] ) } } ] [ WHERE ...] DELETE FROM table_name [ SUBPARTITION { ( partition_name ) | { FOR ( value [ , ... ] ) } } ] [ WHERE ...]
更新数据:
UPDATE table_name [ PARTITION { ( partition_name ) | { FOR ( value [ , ... ] ) } } ] SET [ WHERE ...] UPDATE table_name [ SUBPARTITION { ( partition_name ) | { FOR ( value [ , ... ] ) } } ] SET [ WHERE ...]
在指定二级分区查找数据:
SELECT ... FROM table_name SUBPARTITION (subpartition_name)
单独查询某个分区或子分区数据:
SELECT ... FROM table_name PARTITION { ( partition_name ) | FOR ( value [ , ... ] ) } SELECT ... FROM table_name SUBPARTITION { ( subpartition_name ) | {FOR ( value [, … ] ) }
当查询二级分区表的数据时(不能指定分区或子分区),如果查询条件中包含有分区键的条件,则在生成执行计划时会根据分区键条件过滤掉不符合条件的分区或子分区:
EXPLAIN SELECT ... FROM table_name WHERE ...
示例
1、创建一个分区表并插入数据。
create table t_part_list_range
( id number not null,
partition_key int,
subpartition_key int,
col2 varchar2(10)
)
partition by list(partition_key)
subpartition by range(subpartition_key)
(
partition t_partition_01 values (100)
(subpartition sub_1_1 values less than (10),
subpartition sub_1_2 values less than (20)
),
partition t_partition_02 values (200)
(subpartition sub_2_1 values less than (10),
subpartition sub_2_2 values less than (20)
)
);
insert into t_part_list_range values(1,100,5,'sub_1_1');
insert into t_part_list_range values(2,100,15,'sub_1_2');
insert into t_part_list_range values(3,200,5,'sub_2_1');
insert into t_part_list_range values(4,200,15,'sub_2_2');
insert into t_part_list_range values(5,200,16,'sub_2_2');
select * from t_part_list_range subpartition for (100,5);
2、新增一级与二级分区。
alter table t_part_list_range add partition t_partition_03 values (300)
( subpartition sub_3_1 values less than (10),
subpartition sub_3_2 values less than (20)
);
3、删除指定一级分区包括属于它的所有二级分区。
alter table t_part_list_range drop partition t_partition_02;
4、为指定一级分区新增二级分区。
alter table t_part_list_range modify partition t_partition_01 add subpartition sub_1_3 values less than (30);
5、删除指定二级分区。
alter table t_part_list_range drop subpartition sub_1_3;