oracle interval-partition 解決range分區大難題


博客《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-012014-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.以定長寬度創建分區(比如年、月、具體的數字(比如100500等))

3.分區字段必須是numberdate類型

4.必須至少指定一個range分區(永久分區)

5.當有記錄插入時,系統根據需要自動創建新的分區和本地索引

6.已有的范圍分區可被轉換成間隔分區(通過ALTER TABLE SET INTERVAL選項完成)

7.IntervalPartitioning不支持支持索引組織表

8.Interval Partitioning表上不能創建domain index

 

四、interval分區問題

在oracle自動創建分區的時候,系統會默認指定一個分區名,系統默認創建的分區名字與我們的分區命名規范會有一定的差距,這個問題暫時還不知道有什么解決方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM