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)