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 (NUMTODSINTERVAL(1,'day'))
- 周
按周设置自动分区,示例如下:
INTERVAL (NUMTODSINTERVAL(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)