INTERVAL RANGE分区是RANGE分区的扩展,当新插入的数据超过现有分区的范围时,该分区允许数据库自动创建新分区。

INTERVAL RANGE分区需要包含Interval子句并为新分区指定范围大小。范围划分的高值由范围划分键值决定,当插入的数据值超过了这个高值,数据库将为新插入的数据创建新分区。

如果分区范围设置为1个月,新插入的数据为当前转换点(转换到下一个INTERVAL RANGE分区的键值)两个月后的数据,将仅创建该数据所在月份的分区,而不创建中间月份的分区。例如,您可以创建一个INTERVAL RANGE分区表,该表分区范围为1个月且当前的转换点为2019年2月15日。如果您尝试为2019年5月10日插入数据,那么将创建2019年4月15日至5月15日所需的分区,并将数据插入该分区。将跳过2019年2月15日至2019年3月15日和2019年3月15日至2019年4月15日的分区。

使用限制

  • INTERVAL RANGE分区限制为单个分区键;该键必须是数字或日期范围。
  • 必须定义至少一个RANGE分区。
  • INTERVAL子句不支持索引组织表。
  • 不能在LIST分区表上创建域索引。
  • 不能在分区键列中指定NULL、Not-a-Number和Infinity值。
  • INTERVAL RANGE分区表达式必须为常量,且不能为负数。
  • INTERVAL RANGE分区表的分区只按递增顺序创建。

语法

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>]...);
Where range_partition_definition is:
      PARTITION [<partition_name>]
        VALUES LESS THAN (<value>[, <value>]...)
        [TABLESPACE <tablespace_name>]
        [(<subpartition>, ...)]

INTERVAL参数仅支持设置数字和时间间隔:

  • 数字

    相近的10个数字进入同一个分区,示例如下:

    INTERVAL (10)
  • 时间间隔
    • 按年设置自动分区,示例如下:

      INTERVAL (NUMTOYMINTERVAL(1,'year'))
    • 按月设置自动分区,示例如下:

      INTERVAL (NUMTOYMINTERVAL(1,'month'))
    • 按日设置自动分区,示例如下:

      INTERVAL (NUMTOYMINTERVAL(1,'day'))
    • 按周设置自动分区,示例如下:

      INTERVAL (NUMTOYMINTERVAL(7,'day'))

关于其他参数的介绍,请参见CREATE TABLE...PARTITION BY

示例

以下示例将在sold_month列上按间隔划分表sales。创建RANGE分区是为了建立一个转换点,在转换点之外创建新的分区。

在数据库中创建一个新的INTERVAL RANGE分区,并将数据添加到一个表中。示例如下:

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')
);

查询ALL_TAB_PARTITIONS视图。示例如下:

SELECT partition_name, high_value from ALL_TAB_PARTITIONS;

返回结果如下:

 partition_name |      high_value
----------------+----------------------
 P1             | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
 P2             | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(2 rows)

向超过RANGE分区的高值的sales表中插入数据。示例如下:

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

插入数据后,再次查询ALL_TAB_PARTITIONS视图。示例如下:

SELECT partition_name, high_value from ALL_TAB_PARTITIONS;

成功插入数据,系统将生成一个INTERVAL RANGE分区名称,该名称因每个会话而不同。返回结果如下:

 partition_name |      high_value
----------------+----------------------
 SYS596430103   | FOR VALUES FROM ('15-APR-19 00:00:00') TO ('15-MAY-19 00:00:00')
 P1             | FOR VALUES FROM ('15-JAN-19 00:00:00') TO ('15-FEB-19 00:00:00')
 P2             | FOR VALUES FROM (MINVALUE) TO ('15-JAN-19 00:00:00')
(3 rows)