支持interval分区表
功能描述
interval分区是range分区的扩展。
在没有自动interval分区特性之前,在创建范围(Range)类型分区表时,用户通常会定义一个maxvalue分区,将没有落在当前关注范围内的数据,都放到该分区中,以免发生插入的元组的分区键值不能映射到任何分区的错误。然而当业务场景发生变化时,如果没有及时根据数据增长创建新的分区,就可能会导致分区表的数据发生倾斜,大多数数据都放到了这个未进行细分的maxvlaue分区中,这就违背了用户对表进行分区的初衷:用户希望各个分区的数据量均衡,这样才能加快查询。
自动interval分区可以改善这个问题,对于连续数据类型的Range分区,如果插入的新数据值与当前分区均不匹配,自动interval分区可以自动创建分区。
注意事项
列存表不支持间隔分区。
语法格式
CREATE TABLE table_name
(
...
)
PARTITION BY RANGE(column1)
INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, … ] ) ]
(
PARTITION partition_name1 VALUESLESS THAN ( { partition_value | MAXVALUE } )
PARTITION partition_name2 VALUES LESS THAN ( { partition_value | MAXVALUE } )
);
参数说明
PARTITION BY RANGE(column1)
指定一个range分区的列。
INTERVAL ('interval_expr') [ STORE IN (tablespace_name [, … ] ) ]
间隔分区定义信息。
- interval_expr:自动创建分区的间隔,例如:1 day、1 month。
- STORE IN (tablespace_name [, … ] ):指定存放自动创建分区的表空间列表,如果有指定,则自动创建的分区从表空间列表中循环选择使用,否则使用分区表默认的表空间。
PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } )
指定各分区的信息。partition_name为范围分区的名称。partition_value为范围分区的上边界,取值依赖于partition_key的类型。MAXVALUE表示分区的上边界,它通常用于设置最后一个范围分区的上边界。
每个分区都需要指定一个上边界。
分区上边界的类型应当和分区键的类型一致。
分区列表是按照分区上边界升序排列的,值较小的分区位于值较大的分区之前。
示例
1、创建interval分区表。
CREATE TABLE interval_normal_exchange (logdate date not null)
PARTITION BY RANGE(logdate)
INTERVAL('1 month')
(
PARTITION interval_normal_exchange_p1 VALUES LESS THAN('2020-03-01'),
PARTITION interval_normal_exchange_p2 VALUES LESS THAN('2020-04-01'),
PARTITION interval_normal_exchange_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 = 'interval_normal_exchange')
ORDER BY relname;
返回的分区情况如下:
relname | parttype | partstrategy | boundaries
-----------------------------+----------+--------------+--------------
interval_normal_exchange | r | i |
interval_normal_exchange_p1 | p | r | {2020-03-01}
interval_normal_exchange_p2 | p | r | {2020-04-01}
interval_normal_exchange_p3 | p | r | {2020-05-01}
(4 rows)