全部產品
Search
文件中心

PolarDB:INTERVAL RANGE分區

更新時間:Jul 06, 2024

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)