程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 11g INTERVAL分區新增分區策略。

Oracle 11g INTERVAL分區新增分區策略。

編輯:Oracle數據庫基礎

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''

r />  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分區的分區分配采用的是自治事務。



 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved