Interval分区自动分裂介绍
关键字:
分区、Interval、人大金仓、KingbaseES
1.概述
Interval分区是Range分区的一种扩展,当插入超过已有分区范围的数据时,数据库自动创建相应分区。Interval是一种分区策略,基于时间或数值范围创建分区,每个分区包含特定的时间段或数值范围。可以在输入相应分区数据时自动创建相应的分区,作为范围分区(range partition)的扩展,间隔分区可以让数据库在插入表中的数据超过所有现有范围分区时自动创建指定间隔的分区。
特点:使用Interval类型的值作为划分间隔,Interval分区由数据库内部维护。
定义interval分区的分区表,子分区的以transition point为逻辑分界点,其划分为range-partitioned section和interval-partitioned section。其中transition point可以称为过渡点,具体指在分区键的变化处,数据从一个分区移动到另一个分区的关键点。即用户自定义分区与数据库内部自动创建的interval分区分割点。在Oracle中是一个逻辑概念,本身没有实际字段对应,使用分区类型的变换标识这个状态。也可以取范围分区切换为间隔分区之间的边界值。过渡点的位置决定了间隔分区开始分裂的下限。
举例来说,如果我们创建如下的一个销售表,其中以销售日期作为分区键值。我们初始化创建分区表时设置了时间'2023-02-01',当日期超过了这个时期,数据将从当前分区移动到另一个分区。总得来说transition point就是分区变化时,触发数据移动的临界点。
CREATE TABLE sales
(
sales_id NUMBER,
sales_date TIMESTAMP,
amount NUMBER
)
PARTITION BY RANGE (sales_date) INTERVAL ('1 MONTH')
(
PARTITION sales_jan_2023 VALUES LESS THAN ('2023-02-01'),
) ;
Interval分区索引使用说明
- 简单分区:range分区+interval分区
CREATE TABLE sales
(
sales_id NUMBER,
quantity NUMBER,
sales_date DATE
)
PARTITION BY RANGE (sales_date) INTERVAL (NUMTOYMINTERVAL(1,'month'))
(
PARTITION part1 VALUES LESS THAN (TO_DATE('2023-02-05:12:14:25','yyyy-mm-dd hh24:mi:ss'))
) ;
2.复合分区(range+interval_*)
CREATE TABLE sales
(
sales_id NUMBER,
quantity NUMBER,
sales_date DATE
)
PARTITION BY RANGE (sales_date) INTERVAL (NUMTOYMINTERVAL(1,'month'))
SUBPARTITION BY RANGE(quantity)
SUBPARTITION TEMPLATE
(
SUBPARTITION p_low VALUES LESS THAN (100)
, SUBPARTITION p_medium VALUES LESS THAN (400)
, SUBPARTITION p_ultimate VALUES LESS THAN (maxvalue)
)
(
PARTITION part1 VALUES LESS THAN (TO_DATE('2023-02-05:12:14:25','yyyy-mm-dd hh24:mi:ss'))
);
2 Interval分区表分裂
2.1插入数据分区分裂
往分区表中插入数据,数值将会自动插入到正确的分区,同时根据interval的分区键值决定是否需要创建新的分区,具体如下。
- 新数据的分区边界:插入数据的分区键值大于已定义的最大分区边界,需要创建一个新的分区来容纳插入的数据。在interval分区中,这个新建分区操作是系统完成的,不需要手动进行。如在一个以月为单位的分区表中,插入的数据时间列大于已定义的最大月份,系统则会创建新的分区。
- 存在对应的数据分区边界:判断该值是否属于靠近分区上界的一个间隔值范围内,如果是,则直接插入数据,否则分裂一个新的interval分区以容纳该数据。
上图为数据分区键值大于interval_j-1分区上界,小于interval_j分区上界,则插入到interval_j分区中。
CREATE TABLE interval_test
(
x NUMBER
)
PARTITION BY RANGE (x) INTERVAL (10)
(
PARTITION part1 VALUES LESS THAN (10)
) ;
--(10, 160)
--新分区创建成功
insert into interval_test values (150);
select * from interval_test partition for(150);
--(10, 160)
insert into interval_test partition for(150) values(155);--ok
--partitioning key maps to a partition outside maximum permitted number of partitions
insert into interval_test partition for(150) values(145);--failed
insert into interval_test partition for(150) values(45); --failed
3 总结
Insert 插入数据,属于已有分区则则直接插入;不属于已有分区,则创建新的interval分区。当插入数据属于一个interval分区同时不在最后一个分区间隔内,那么就分裂一个新的interval分区。
以下为插入数据时,分区自动分裂的用例。
CREATE TABLE sales2
(
sales_id NUMBER,
quantity NUMBER,
sales_date DATE
)
PARTITION BY RANGE (sales_date) INTERVAL (NUMTOYMINTERVAL(1,'month'))
(
PARTITION part1 VALUES LESS THAN (TO_DATE('2023-02-05:12:14:25','yyyy-mm-dd hh24:mi:ss'))
) ;
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(1, 5, TO_DATE('2022-01-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'));
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(2, 3, TO_DATE('2023-08-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'));
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(3, 5, TO_DATE('2023-04-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'));
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(4, 15, TO_DATE('2023-06-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'));
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(2, 4, TO_DATE('2023-06-01:12:15:25', 'YYYY-MM-DD hh24:mi:ss'));
INSERT INTO sales4(sales_id, quantity, sales_date)
VALUES(8, 4, TO_DATE('2023-10-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'));
数据插入前的分区表结构:
数据插入后的分区表结构:
参考资料
《KingbaseES SQL语言参考手册》




