Oracle11g的新增特性—INTERVAL分區

轉自紅聯


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分區的分區分配採用的就是自治事務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章