VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

支持interval分区表

功能描述

interval分区是range分区的扩展。

在没有自动interval分区特性之前,在创建范围Range类型分区表时,我们通常会定义一个maxvalue分区,将没有落在当前关注范围内的数据,都放到该分区中,以避免插入的元组的分区键值不能映射到任何分区的错误。

然而当业务场景发生变化时,如果没有及时根据数据增长创建新的分区,就可能会导致分区表的数据发生倾斜,大多数数据都放到了这个未进行细分的maxvlaue分区中,这就违反了对表进行分区的初衷,为了加快查询,则需要各个分区的数据量均衡。

自动interval分区可以改善这个问题,对于连续数据类型的Range分区,如果插入的新数据值与当前分区均不匹配,则可以自动创建分区。

语法格式

CREATE TABLE table_name
(
  ...
)
PARTITION BY RANGE(column1)
INTERVAL (interval_expr) [STORE IN(tablespace_name[,...])]
(
  PARTITION partition_name1 VALUES LESS THAN(literal | MAXVALUE) [TABLESPACE tablespace1],
  PARTITION partition_name2 START(num1) END(num2)
);

参数说明

  • PARTITION BY RANGE(column1)

    指定一个range分区的列。

  • INTERVAL

    指定分区间隔。

  • interval_expr

    字符串类型或number类型,表示指定间隔值。

    interval_expr值不可为空或NULL,当为number类型时不可为0、负数,可以为浮点值。

  • [STORE IN(tablespace_name[,…])]

    指定存放自动创建分区的表空间列表。如果有指定则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。

  • partition_name2

    分区名称,需符合命名规范。

  • START(num1) END(num2)

    当使用number类型作为分区键时,分区范围可以使用start(num1) end(num2)指定起始值,其中num1为初始值,end为结束值。

注意事项

示例

示例1 :使用字符串类型作为分区键创建interval分区

1、创建interval分区表。

CREATE TABLE test1 (logdate date not null)
PARTITION BY RANGE(logdate)
INTERVAL('1 month')
(
        PARTITION test1_p1 VALUES LESS THAN('2020-03-01'),
        PARTITION test1_p2 VALUES LESS THAN('2020-04-01'),
        PARTITION test1_p3 VALUES LESS THAN('2020-05-01')
);

2、执行以下语句查询分区情况。

SELECT relname,parttype,partstrategy,boundaries FROM pg_partition 
WHERE parentid = (SELECT oid FROM pg_class WHERE relname = 'test1')
ORDER BY relname;

返回的分区情况如下:

  relname | parttype | partstrategy |  boundaries
----------+----------+--------------+---------------
 test1    | r        | i            |
 test1_p1 | p        | r            | {2020-03-01}
 test1_p2 | p        | r            | {2020-04-01}
 test1_p3 | p        | r            | {2020-05-01}
(4 rows)

示例2 :使用number类型作为分区间创建interval分区

1、创建interval分区表。

create table test2 
( 
        id number not null, 
        name nvarchar2(16) 
) 
partition by range(id) 
interval(5000) 
( 
        partition p1 values less than(5000), 
        partition p2 values less than(10000), 
        partition p3 values less than(15000)
); 

2、向表中插入数据,并查看表内容。

insert into test2 values(500,'test1'); 
insert into test2 values(9500,'test2'); 
insert into test2 values(13500,'test3');
insert into test2 values(18000,'test4');
insert into test2 values(30000,'test5');
insert into test2 values(25000,'test6'); 
insert into test2 values(19000,'test7');   
select * from test2 order by id;

结果显示为:

  id   | name
-------+-------
   500 | test1
  9500 | test2
 13500 | test3
 18000 | test4
 19000 | test7
 25000 | test6
 30000 | test5
(7 rows)

3、查询分区情况。

SELECT relname,parttype,partstrategy,boundaries FROM pg_partition 
WHERE parentid = (SELECT oid FROM pg_class WHERE relname = 'test2')
ORDER BY relname;

结果显示为:

 relname | parttype | partstrategy | boundaries
---------+----------+--------------+------------
 p1      | p        | r            | {5000}
 p2      | p        | r            | {10000}
 p3      | p        | r            | {15000}
 sys_p1  | p        | i            | {20000}
 sys_p2  | p        | i            | {35000}
 sys_p3  | p        | i            | {30000}
 test2   | r        | i            |
(7 rows)

4、查询分区sys_p2的内容。

select * from test2 partition(sys_p1);

结果显示为:

  id   | name
-------+-------
 18000 | test4
 19000 | test7
(2 rows)