範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別

yangtingkun發表於2010-03-08

範圍分割槽表和INTERVAL分割槽表是可以相互轉化的,不過二者還是有所區別的。比如在SPLIT分割槽的時候,範圍分割槽表沒有限制,而INTERVAL分割槽表則可能報錯。

 

 

首先看範圍分割槽的例子:

SQL> CREATE TABLE T_PART_RANGE
  2  (ID NUMBER,
  3  NAME VARCHAR2(30),
  4  CREATE_DATE DATE)
  5  PARTITION BY RANGE (CREATE_DATE)
  6  (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),
  7  PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')),
  8  PARTITION P3 VALUES LESS THAN (TO_DATE('2009-9', 'YYYY-MM')));

表已建立。

SQL> ALTER TABLE T_PART_RANGE
  2  SPLIT PARTITION P3
  3  AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))
  4  INTO (PARTITION P3, PARTITION P4);

表已更改。

SQL> SELECT PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_RANGE'
  4  ORDER BY 1;

PARTITION_NAME HIGH_VALUE
-------------- ----------------------------------------------------------------------------------
P1             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P2             TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P3             TO_DATE(' 2009-07-30 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P4             TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

同樣的操作,在INTERVAL分割槽表上執行就會報錯:

SQL> CREATE TABLE T_PART_INTER
  2  (ID NUMBER,
  3  NAME VARCHAR2(30),
  4  CREATE_DATE DATE)
  5  PARTITION BY RANGE (CREATE_DATE)
  6  INTERVAL (INTERVAL '4' MONTH)
  7  (PARTITION P1 VALUES LESS THAN (TO_DATE('2009-1', 'YYYY-MM')),
  8  PARTITION P2 VALUES LESS THAN (TO_DATE('2009-5', 'YYYY-MM')));

表已建立。

SQL> INSERT INTO T_PART_INTER
  2  VALUES (1, 'TEST', TO_DATE('2009-8', 'YYYY-MM'));

已建立 1 行。

SQL> COMMIT;

提交完成。

SQL> SELECT PARTITION_NAME, HIGH_VALUE
  2  FROM USER_TAB_PARTITIONS
  3  WHERE TABLE_NAME = 'T_PART_INTER'
  4  ORDER BY 1;

PARTITION_NAME HIGH_VALUE
-------------- ----------------------------------------------------------------------------------
P1             TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P2             TO_DATE(' 2009-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P96        TO_DATE(' 2009-09-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')

SQL> ALTER TABLE T_PART_RANGE
  2  SPLIT PARTITION FOR(TO_DATE('2009-8', 'YYYY-MM'))
  3  AT (TO_DATE('2009-7-30', 'YYYY-MM-DD'))
  4  INTO (PARTITION P3, PARTITION P4);
ALTER TABLE T_PART_RANGE
*
1 行出現錯誤:
ORA-14080:
無法按指定的上限來分割分割槽

顯然導致問題的原因是由於SPLIT分割槽操作後,INTERVAL分割槽會根據SPLIT的日期作為基準時間,在此基礎上進行INTERVAL遞增,因此大於28日的日誌使用INTERVAL則會導致在2月的時候出錯,所以Oracle禁止大於28日的日期作為INTERVAL MONTH的基礎分割槽。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-628939/,如需轉載,請註明出處,否則將追究法律責任。

相關文章