Oracle11g INTERVAL分割槽新增分割槽策略
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 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分割槽的分割槽分配採用的是自治事務。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69498/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- INTERVAL分割槽表鎖分割槽操作
- 範圍分割槽表和INTERVAL分割槽表對於SPLIT分割槽的區別
- DATE型別INTERVAL分割槽型別
- Oracle帶區域性分割槽索引的分割槽表刪除舊分割槽新增新分割槽Oracle索引
- 學習筆記】分割槽表和分割槽索引——新增表分割槽(二)筆記索引
- ORACLE 11g 範圍分割槽錶轉換INTERVAL分割槽表Oracle
- MySql資料分割槽操作之新增分割槽操作MySql
- Hive和Spark分割槽策略HiveSpark
- Flink的分割槽策略
- 如何查詢分割槽表的分割槽及子分割槽
- linux新增swap分割槽Linux
- linux 新增硬碟分割槽Linux硬碟
- swap分割槽新增刪除
- Oracle分割槽表全域性索引新增分割槽時不會失效Oracle索引
- Linux 新增LVM分割槽及LVM分割槽擴容LinuxLVM
- 全面學習分割槽表及分割槽索引(10)--交換分割槽索引
- PLSQL根據分割槽表的分割槽名批次truncate分割槽SQL
- Linux主分割槽,擴充套件分割槽,邏輯分割槽Linux套件
- 定期truncate 歷史間隔分割槽INTERVAL PARTITION
- Oracle Interval Partition 自動分割槽表-實驗Oracle
- 11g分割槽新特性之interval partition
- Oracle分割槽表及分割槽索引Oracle索引
- 全面學習分割槽表及分割槽索引(13)--分隔表分割槽索引
- 用檔案新增Swap分割槽
- Oracle11g維護分割槽概述Oracle
- 使用split對分割槽表再分割槽
- 簡單ORACLE分割槽表、分割槽索引Oracle索引
- rebuild分割槽表分割槽索引的方法Rebuild索引
- 分割槽表及分割槽索引建立示例索引
- oracle分割槽表和分割槽表exchangeOracle
- 全面學習分割槽表及分割槽索引(9)--刪除表分割槽索引
- 全面學習分割槽表及分割槽索引(11)--合併表分割槽索引
- 全面學習分割槽表及分割槽索引(12)--修改list表分割槽索引
- Linux主分割槽,擴充套件分割槽,邏輯分割槽[final]Linux套件
- 【學習筆記】分割槽表和分割槽索引——管理索引分割槽(四)筆記索引
- Oracle查詢Interval partition分割槽表內資料Oracle
- 使用Oracle Database 11g建立Interval分割槽表OracleDatabase
- interval partition自動新增分割槽引起的shared pool 4031錯誤