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)