Interval范围分区

PolarDB PostgreSQL版(兼容Oracle)支持Interval(间隔)范围分区功能,本文详细介绍了其语法和示例。

简介

PolarDB PostgreSQL版(兼容Oracle)提供了自动创建范围分区的特性,即Interval范围分区,在您创建范围分区表时,可以指定Interval表达式,确定自动分区的范围。当插入的值无法匹配到已有分区时,PolarDB PostgreSQL版(兼容Oracle)将自动为您创建一个分区。

Interval范围分区是范围分区的扩展,它允许数据库在新插入的数据超出现有分区的范围时自动创建新分区。要实现间隔范围分区,请包含INTERVAL子句并指定新分区的范围大小。范围分区的高值(也称为转换点)由范围分区键值确定。数据库会为插入的数据创建新的分区,其值超出了该高值。

如果间隔设置为1个月,并且在当前插入最新分区之后两个月的数据,则仅创建该月的分区,而不创建中间分区。 例如,您可以创建一个间隔范围分区表,间隔为每月,最新分区的范围为2019年1月15日至2019年2月15日。如果您尝试插入2019年5月10日的数据,则所需的分区为4月15日到5月15日被创建,数据将插入到该分区中,跳过2019年2月15日至2019年3月15日和2019年3月15日至2019年4月15日的分区,且不会创建这两个分区。

使用限制

以下限制适用于INTERVAL子句:

  • 区间范围分区仅限于单个分区键,该键必须是数字或日期范围。

  • 必须至少定义一个范围分区。

  • 在复合分区中,间隔范围分区可用于主分区机制,但不支持子分区级别。

  • DEFAULT和MAXVALUE不能为区间范围分区表定义。

  • 不能在分区键列中指定NULL、Not-a-Number或Infinity值。

  • 区间范围分区表达式必须产生常量值并且不能为负值。

  • 间隔范围分区表的分区仅支持按照升序创建。

语法

CREATE TABLE [ schema. ]<table_name>
   <table_definition>
   PARTITION BY RANGE(<column>[, <column> ]...)
   [INTERVAL (<constant> | <expression>)]
   [SUBPARTITION BY {RANGE|LIST|HASH} (<column>[, <column> ]...)]
   (<range_partition_definition>[, <range_partition_definition>]...)
   [ENABLE ROW MOVEMENT];
WHERE range_partition_definition IS:

      PARTITION [<partition_name>]
        VALUES LESS THAN (<value>[, <value>]...)
        [TABLESPACE <tablespace_name>]
        [(<subpartition>, ...)]

示例

本示例展示了按sell_month列上的时间间隔分区的sales表。创建范围分区是为了建立两个范围分区,然后插入一行不在已有分区范围内的数据,Interval分区将会被自动创建。

CREATE TABLE sales
(
  prod_id           int,
  prod_quantity     int,
  sold_month        date
)
PARTITION BY RANGE(sold_month)
INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
(
  PARTITION p1
    VALUES LESS THAN('15-JAN-2019'),
  PARTITION p2
    VALUES LESS THAN('15-FEB-2019')
);


 partition_name |      high_value
----------------+----------------------
 P1             | '15-JAN-19 00:00:00'
 P2             | '15-FEB-19 00:00:00'
(2 rows)

INSERT INTO sales VALUES (1,200,'10-MAY-2019');
INSERT 0 1

SELECT partition_name, high_value FROM ALL_TAB_PARTITIONS;
 partition_name |      high_value
----------------+----------------------
 P1             | '15-JAN-19 00:00:00'
 P2             | '15-FEB-19 00:00:00'
 SYS916340103   | '15-MAY-19 00:00:00'
(3 rows)