博客《oracle分區》中講了oracle的幾種分區,並且對於oracle的典型分區如Range分區和List分區給了示例。
在實際運用Range分區時,遇到了這樣的難題:
createtableTMP_LXQ_1
(
PROPOSALNO VARCHAR2(22),
STARTDATE DATE
)
partitionbyrange(STARTDATE) (
partitionpart_t01values less than(to_date('2008-01-01','yyyy-mm-dd')) ,
partitionpart_t02values less than(to_date('2009-01-01','yyyy-mm-dd')) ,
partitionpart_t03values less than(to_date('2010-01-01','yyyy-mm-dd')) ,
partitionpart_t04values less than(to_date('2011-01-01','yyyy-mm-dd')) ,
partitionpart_t05values less than(to_date('2012-01-01','yyyy-mm-dd')) ,
partitionpart_t06values less than(to_date('2013-01-01','yyyy-mm-dd')) ,
partitionpart_t07values less than(maxvalue)
);
本例中的時間只是到了2013年,然后2013年之后的時間完全放入到了maxvalue中,這確實也是一種解決辦法,即有除去2008-2013年的數據時,數據庫不會報錯。但是這樣就改變了我們分區的初衷,分區是想讓各個部分的數據均衡,以加快查詢。
在oracle11g出現之前,實際工作中經常會遇到這種情況,而處理這種情況,通常是由DBA或者開發人員手動進行分區或者直接定義maxvalue。
Oracle 11g的新增特性Interval分區可以解決這個問題,下面介紹一下Interval分區。
一、interval分區
INTERVAL分區是Oracle11g新增的特性,它是針對Range類型分區的一種功能拓展。對連續數據類型的Range分區,如果插入的新數據值與當前分區均不匹配,Interval-Partition特性可以實現自動的分區創建。
示例:
createtable TMP_LXQ_1
(
proposalnovarchar2(22),
startdatedate
)
partitionby range(STARTDATE)
interval(numtoyminterval(1,'year'))(
partitionpart_t01 values less than(to_date('2008-01-01','yyyy-mm-dd')) ,
partitionpart_t02 values less than(to_date('2009-01-01','yyyy-mm-dd')) ,
partitionpart_t03 values less than(to_date('2010-01-01','yyyy-mm-dd')) ,
partitionpart_t04 values less than(to_date('2011-01-01','yyyy-mm-dd')) ,
partitionpart_t05 values less than(to_date('2012-01-01','yyyy-mm-dd')) ,
partitionpart_t06 values less than(to_date('2013-01-01','yyyy-mm-dd'))
);
如果插入2014年的值,系統會自動的添加一個分區,分區范圍為2014-01-01到2014-12-31日。
二、interval分區和range分區的轉換
ALTERTABLE TMP_LXQ_1 SET INTERVAL (numtoyminterval(1,'year'));
對於INTERVAL分區表,新增的超過分區上限的數據會自動導致對應的INTERVAL分區被建立。
同樣INTERVAL分區表可以方便的轉化為RANGE分區表,只需要不輸入INTERVAL的值即可:
ALTER TABLETMP_LXQ_1 SET INTERVAL ();
三、interval分區的特點
1.由range分區派生而來
2.以定長寬度創建分區(比如年、月、具體的數字(比如100、500等))
3.分區字段必須是number或date類型
4.必須至少指定一個range分區(永久分區)
5.當有記錄插入時,系統根據需要自動創建新的分區和本地索引
6.已有的范圍分區可被轉換成間隔分區(通過ALTER TABLE SET INTERVAL選項完成)
7.IntervalPartitioning不支持支持索引組織表
8.在Interval Partitioning表上不能創建domain index
四、interval分區問題
在oracle自動創建分區的時候,系統會默認指定一個分區名,系統默認創建的分區名字與我們的分區命名規范會有一定的差距,這個問題暫時還不知道有什么解決方法。