Oracle 間隔分割槽

winston_DBA發表於2015-06-07

    間隔分割槽是範圍分割槽的一個擴充,當插入的資料超過了現有的所有分割槽時,資料庫會按照指定的間隔自動建立分割槽。Oracle支援建立單一的間隔分割槽表也可以建立interval-range、interval-hash和interval-list三種組合分割槽表。
 
使用間隔分割槽的場景:
1.使用間隔分割槽最大的好處就是不用再提前手工的建立分割槽,只要後續建立的分割槽的分割槽間隔是統一的,就可以考慮使用間隔分割槽。並且,在後續建立的分割槽中還能透過store in 選項以迴圈複用的方式來將分割槽存放到不同的表空間裡。
2.如果某張表是範圍分割槽,則很容易的將該錶轉換成間隔分割槽表,例如sh使用者下的sales表,可透過如下語句來修改:
SH@ORA11GR2 > ALTER TABLE sales SET INTERVAL (NUMTOYMINTERVAL(1,'MONTH'));
Table altered.
注意,如果範圍分割槽存在最大分割槽MAXVALUE時,無法透過命令直接改為間隔分割槽。
例如,先建立表interval_test
create table interval_test (id number, name varchar2(20))
partition by range(id)
(partition p1 values less than (100),
partition p2 values less than (200),
partition p3 values less than(MAXVALUE));
接著嘗試將該表修改為間隔分割槽表
SH@ORA11GR2 >  alter table interval_test set interval (200);
 alter table interval_test set interval (200)
*
ERROR at line 1:
ORA-14759: SET INTERVAL is not legal on this table.
使用oerr檢視報錯資訊
[oracle@oracle11g ~]$ oerr  ora 14759
14759,  00000, "SET INTERVAL is not legal on this table."
// *Cause: SET INTERVAL clause was specified. ALTER TABLE SET INTERVAL is
//         only legal on a range partitioned table with a single partitioning
//         column. Additionally, this table cannot have a maxvalue partition
//         and cannot be the parent table for any reference partitioned tables.
// *Action: Use SET INTERVAL only on a valid table.

3.如果某張表為間隔分割槽表,則無法手工的對該表手動新增分割槽。所以如果決定將某張表修改為間隔分割槽,要考慮修改相關的應用程式或者儲存過程。
SH@ORA11GR2 > alter table interval_sales add partition p4 values less than (to_date('20150101','yyyymmdd'));
alter table interval_sales add partition p4 values less than (to_date('20150101','yyyymmdd'))
            *
ERROR at line 1:
ORA-14760: ADD PARTITION is not permitted on Interval partitioned objects
  
使用間隔分割槽的限制:
1.只能指定一個分割槽鍵,並且鍵值型別只能為number或date。
2.間隔分割槽不支援索引組織表。
3.不能在間隔分割槽上建立域索引(domain index)

管理間隔分割槽:
1.建立間隔分割槽:
CREATE TABLE interval_sales
    ( prod_id        NUMBER(6)
    , cust_id        NUMBER
    , time_id        DATE
    , channel_id     CHAR(1)
    , promo_id       NUMBER(6)
    , quantity_sold  NUMBER(3)
    , amount_sold    NUMBER(10,2)
    )
  PARTITION BY RANGE (time_id)
  INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))
  STORE IN (interv1, interv2)
    ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY')),
      PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2009', 'DD-MM-YYYY')),
      PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')),
      PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) );
2.禁用間隔分割槽
SH@ORA11GR2 > alter table interval_sales set interval ();
Table altered.
3.修改間隔分割槽interval值
SH@ORA11GR2 > alter table interval_sales set interval (NUMTOYMINTERVAL(1,'YEAR'));
Table altered.
4.刪除間隔分割槽
SH@ORA11GR2 >  ALTER TABLE interval_sales  DROP PARTITION FOR(TO_DATE(' 2008-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'));
Table altered.
5.Merge間隔分割槽
首先插入兩條資料,讓系統自動生成兩個間隔分割槽
SH@ORA11GR2 > insert into interval_sales values (1,2,to_date('20150101','yyyymmdd'),3,3,3,3);
1 row created.
SH@ORA11GR2 > commit;
Commit complete.
SH@ORA11GR2 >  insert into interval_sales values (1,2,to_date('20150201','yyyymmdd'),3,3,3,3);
1 row created.
SH@ORA11GR2 > commit;
接著,執行命令,合併兩個分割槽
SH@ORA11GR2 >  alter table interval_sales merge partitions for ( to_date('20150101','yyyymmdd')) , for(to_date('20150201','yyyymmdd'));
 Table altered.
注意,合併的兩個分割槽需要前後相連,否則報錯,無法合併!
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30167136/viewspace-1690757/,如需轉載,請註明出處,否則將追究法律責任。

相關文章