INTERVAL分區是Oracle11g新增的特性,這種范圍分區不需要定義MAXVALUE,Oracle會根據分區定義的INTERVAL來動態的分配新分區來容納超過范圍的數據。
Oracle在分配新分區的時候只會給存在數據的分區進行分配,對於不存在數據的分區並不會馬上分配,而是在需要的時候才去分配。
對於這個分區分配策略,是在無意中發現的:
SQL> CREATE TABLE T_INTERVAL_PART
2 PARTITION BY RANGE (CREATED)
3 INTERVAL (NUMTOYMINTERVAL(1, ''MONTH''))
4 (PARTITION P1 VALUES LESS&nbs
p;THAN (TO_DATE(''2007-9-1'', ''YYYY-MM-DD'')))
5 AS SELECT * FROM DBA_OBJECTS;
表已創建。
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS
2 WHERE TABLE_NAME = ''T_INTERVAL_PART''
3 ORDER BY 2;
TABLE_NAME PARTITION_NAME HIGH_VALUE
--------------- -------------- ---------------------------------------------------------------------
T_INTERVAL_PART P1 TO_DATE('' 2007-09-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GR
T_INTERVAL_PART SYS_P113 TO_DATE('' 2007-11-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALEND
T_INTERVAL_PART SYS_P114 TO_DATE('' 2007-10-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALEND
上面這個例子就是在介紹INTERVAL分區時使用的例子,不過這個例子中存在一個比較奇怪的顯現,那就是對於2007年11月的分區對於的分區名稱中的序號反而小於2007年10月的。
看到這個現象,第一個反應就是認為,Oracle根據INTERVAL的值的上限,從高到低依次創建分區,但是隨後的測試發現並非如此:
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS
2 WHERE TABLE_NAME = ''T_INTERVAL_PART''
Oracle並沒有創建從07年12月到08年12月之間的所有的分區,而是僅僅創建了08年12月份的分區。這說明Oracle會根據插入數據的分區鍵值來分配所需的分區,中間沒有包含數據的分區不會被創建。
同時也解釋了為什麼07年11月分區的分區序號小於10月份的,這是由於在建立分區表並插入數據的過程中,首先出現了11月份的記錄,而後才出現了10月份的。
下面驗證一下這個結論:
SQL> SELECT * FROM (SELECT ROWNUM RN, OWNER, OBJECT_NAME, CREATED FROM DBA_OBJECTS)
2 WHERE CREATED >= TO_DATE(''2007-10-1'', ''YYYY-MM-DD'')
3 AND ROWNUM = 1;
RN OWNER OBJECT_NAME CREATED
---------- ------------------------------ ------------------------------ -------------------
68234 YANGTK T_INTERVAL_PART 2007-10-21 02:16:06
SQL> SELECT * FROM (SELECT ROWNUM RN, OWNER, OBJECT_NAME, CREATED FROM DBA_OBJECTS)
2 WHERE CREATED >= TO_DATE(''2007-9-1'',
--------------
68240 SYS T_PART 2007-09-15 16:25:15
由於查詢DBA_OBJECTS視圖的時候,先查詢到創建時間為10月21日的記錄,因此,INTERVAL分區表先建立了上限為11月1日的分區,隨後建立了上限為10月1日的分區。
SQL> ROLLBACK;
回退已完成。
SQL> SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS
2 WHERE TABLE_NAME = ''T_INTERVAL_PART''
3 ORDER BY 2;
TABLE_NAME PARTITION_NAME HIGH_VALUE
--------------- -------------- ---------------------------------------------------------------------
T_INTERVAL_PART P1 TO_DATE('' 2007-09-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALENDAR=GR
T_INTERVAL_PART SYS_P113 TO_DATE('' 2007-11-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALEND
T_INTERVAL_PART SYS_P114 TO_DATE('' 2007-10-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALEND
T_INTERVAL_PART SYS_P115 TO_DATE('' 2008-12-01 00:00:00'', ''SYYYY-MM-DD HH24:MI:SS'', ''NLS_CALEND
而且,即使觸發Oracle分配新的分區的數據被回滾了,新增分區也不會被刪除。從這一點可以推斷,INTERVAL分區的分區分配采用的是自治事務。