轉自紅聯
Oracle11g有一個新增的特性INTERVAL分區,此種範圍分區不需要定義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 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'
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並沒有創建從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', 'YYYY-MM-DD')
3 AND CREATED < TO_DATE('2007-10-1', 'YYYY-MM-DD')
4 AND ROWNUM = 1;
RN OWNER OBJECT_NAME CREATED
---------- ------------------------------
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分區的分區分配採用的就是自治事務。