金仓数据库KingbaseES 分区表的分区管理(二)
关键字:
KingbaseES、分区表、TRUNCATE分区、子分区模板、人大金仓、KingbaseES
分区表介绍
分区表是在一个节点内部对数据按照用户指定策略做进一步的水平分区,将表中数据按照指定方式划分为多个互不重叠的部分。
在KingbaseES数据库中,分区能够将大表和索引分解成更小、更易于管理子分区。每个分区是一个独立的对象,具有其自己的名称和存储特征。在KingbaseES数据中提供了多条命令,进行分区表的分区管理。合理使用这些命令可以简化许多操作。本文主要介绍分区表的分区管理,包括:TRUNCATE分区、子分区模板。
TRUNCATE分区
在KingbaseES数据库中,想删除分区表中某个分区数据,却不想使用DELETE命令时,可以使用alter table … truncate partition … 命令。TRUNCATE命令对比DELETE命令可以更快的删除数据,但是需要使用者拥有该表执行DDL命令的权限。
示例:创建拥有分区P1和分区P2的分区表partitioned_table,并为其插入待清空的数据。
--创建分区表partitioned_table
CREATE TABLE partitioned_table (
id serial,
user_id int,
create_time timestamp(0)
)
PARTITION BY RANGE(create_time);
--增加表分区P1
CREATE TABLE partitioned_table_p1
partition of partitioned_table
FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
--增加表分区P2
CREATE TABLE partitioned_table_p2
partition of partitioned_table
FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');
--可以看到增加的分区P1和P2
select table_name, partition_name from user_tab_partitions where table_name in ('PARTITIONED_TABLE');
--插入数据
Insert into partitioned_table(user_id, create_time) values (1, '2020-12-01'), (1, '2021-11-21'), (1, '2020-01-05'), (1, '2021-10-01');
select * from partitioned_table;
--清空分区P1
alter table partitioned_table truncate partition P1;
--可以看到分区完全清空
select * from partitioned_table;
子分区模板
在KingbaseES数据库中,可以使用子分区模板,在创建分区时根据模板创建子分区。需要注意的是,子分区模板不会影响已经创建的分区,只有新创建的分区才会根据模板创建子分区。创建子分区模板有两类命令 create table … partition by … subpartition by … subpartition template ….. 和 alter table … set subpartition template。
- 使用Create table 命令创建子分区模板
--创建分区表subpartitioned_table1
CREATE TABLE subpartitioned_table1 (
id serial,
user_id int,
create_time timestamp(0)
)
PARTITION BY RANGE(create_time) INTERVAL ('1 year'::INTERVAL)
Subpartition by range(id)
subpartition template
(
Subpartition less1 values less than (10),
Subpartition less2 values less than (20),
Subpartition less3 values less than (30)
)
(
Partition p1 values less than ('2020-01-01')
);
--查看建立的子分区模板
\d+ subpartitioned_table1
--查看通过子分区模板建立的子分区
\d+ SUBPARTITIONED_TABLE1_P1
--查看增加新分区时的子分区(在间隔分区中插入数据会创建不存在的分区)
Insert into SUBPARTITIONED_TABLE1 values(2, 2, '2021-02-01');
\d+ subpartitioned_table1
--新分区会根据子分区模板创建子分区
\d+ SUBPARTITIONED_TABLE1_P2
- 使用alter table 命令建立子分区模板
CREATE TABLE subpartitioned_table2 (
id serial,
user_id int,
create_time timestamp(0)
)
PARTITION BY RANGE(create_time) INTERVAL ('1 year'::INTERVAL)
Subpartition by range(id)
(
Partition p1 values less than ('2020-01-01')
);
Alter table subpartitioned_table2 set subpartition template
(
Subpartition less1 values less than (10),
Subpartition less2 values less than (20),
Subpartition less3 values less than (30)
);
--查看建立的子分区模板
\d+ subpartitioned_table2
--子分区模板创建、修改,不影响先前分区
--查看定义子分区模板之前的分区,发现并没有创建子分区(存在的子分区数值范围是最小值到最大值)
\d+ subpartitioned_table2_p1
--插入数据创建新分区区时,会根据模板建立子分区
Insert into SUBPARTITIONED_TABLE2 values(2, 2, '2021-02-01');
\d+ subpartitioned_table2_p2
- 使用alter命令修改子分区模
Alter table subpartitioned_table2 set subpartition template
(
Subpartition less1 values less than (15),
Subpartition less3 values less than (30)
);
--查看子分区模板,发现模板已经修改
\d+ subpartitioned_table2
总结
在KingbaseES中提供了多条命令进行分区表分区管理,本文主要介绍了TRUNCATE分区和子分区模板的相关命令。