oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网
范圍分區(qū)允許用戶根據(jù)分區(qū)鍵列值的范圍創(chuàng)建分區(qū)。下面是一個按范圍分區(qū)表的示例:
create table sales6
(
sales_id number,
sales_dt date
)
partition by range (sales_dt)
(
partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd')),
partition p0702 values less than (to_date('2007-03-01','yyyy-mm-dd'))
);
假如在此處僅針對2007年1月和2007年2月定義了分區(qū),如果表中插入一條sales_dt在2007年3月的記錄,會發(fā)生什么情況?插入將失敗,并顯示以下錯誤:
ORA-14400: inserted partition key does not map to any partition
顯然,需要針對2007年3月添加一個分區(qū),然后才能插入一條記錄。但通常說起來容易做起來難。通常無法容忍事先創(chuàng)建大量分區(qū),但其中很少一部分可能會產(chǎn)生此錯誤。
如果Oracle以某種方式自動察覺到對新分區(qū)的需要,然后創(chuàng)建它們,這樣不是更好嗎?Oracle 11g可以,它可以使用一個稱為間隔分區(qū)的特性。此時,不必定義分區(qū)及它們的邊界,只需定義一個定義了每個分區(qū)邊界的間隔。下面是使用間隔分區(qū)的示例:
create table sales6
(
sales_id number,
sales_dt date
)
partition by range (sales_dt)
interval (numtoyminterval(1,'MONTH'))
(
partition p0701 values less than (to_date('2007-02-01','yyyy-mm-dd'))
);
注意子句interval后面跟著時間間隔,在此處指示Oracle為每個月份創(chuàng)建一個時間間隔。已經(jīng)為2007年1月的數(shù)據(jù)創(chuàng)建了名為p0701的初始分區(qū)。現(xiàn)在,假設(shè)插入了一條包括2007年6月數(shù)據(jù)的記錄:
SQL> insert into sales6 values (1,'01-jun-07');
1 row created.
Oracle不會返回錯誤,而是成功執(zhí)行該語句。那么這條記錄將轉(zhuǎn)向何處?p0701 分區(qū)不能包括該記錄,因?yàn)闆]有為2007年6月定義分區(qū)。但此時,如果檢查該表的分區(qū):
SQL> select partition_name, high_value
2 from user_tab_partitions
3 where table_name = 'SALES6';
PARTITioN_NAME HIGH_VALUE
----------------------------------------------------------------
P0701 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C
ALENDAR=GREGORIA
SYS_P41 TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C
ALENDAR=GREGORIA
注意名為SYS_P1、HIGH_VALUE為2007年7月1日分區(qū),它最多可以容納到6月底的數(shù)據(jù)。該分區(qū)是由Oracle動態(tài)創(chuàng)建的,并具有一個系統(tǒng)生成的名稱。
現(xiàn)在,假設(shè)輸入一個小于HIGH_VALUE的值,如2007年5月1日。在理想情況下,它應(yīng)該具有自己的分區(qū),因?yàn)榉謪^(qū)時間間隔是一個月。
SQL> insert into sales6 values (1,'01-may-07');
1 row created.
SQL> select partition_name, high_value
2 from user_tab_partitions
3 where table_name = 'SALES6';
PARTITioN_NAME HIGH_VALUE
----------------------------------------------------------------
P0701 TO_DATE(' 2007-02-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C
ALENDAR=GREGORIA
SYS_P41 TO_DATE(' 2007-07-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C
ALENDAR=GREGORIA
SYS_P42 TO_DATE(' 2007-06-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_C
ALENDAR=GREGORIA
注意新分區(qū)SYS_P42,其上限為6月1日,因此該分區(qū)可以保留2006年5月的數(shù)據(jù)。該分區(qū)是通過拆分SYS_P41分區(qū)創(chuàng)建的(針對6月份)。因此,當(dāng)定義一個間隔分區(qū)方案時,Oracle會自動創(chuàng)建和維護(hù)分區(qū)。
如果希望將分區(qū)存儲在特定表空間中,可以使用store in子句執(zhí)行該操作:
interval (numtoyminterval(1,'MONTH'))
store in (TS1,TS2,TS3)
該子句以循環(huán)方式將分區(qū)存儲在表空間TS1、TS2和TS3中。
應(yīng)用程序開發(fā)人員如何定位特定分區(qū)?一種方法是知道名稱,這種方法可能不可行,即使知道名稱,這種方法也非常容易出錯。為了便于訪問特定分區(qū),Oracle 11g為分區(qū)SQL提供了一個新語法:
SQL> select * from sales6 partition for (to_date('15-may-2007','dd-mon-yyyy'));
SALES_ID SALES_DT
---------- ---------
1 01-MAY-07
注意新子句for(值),它允許用戶直接引用分區(qū),而不必通過它們的準(zhǔn)確名稱進(jìn)行顯式調(diào)用。如果希望截?cái)嗷騽h除一個分區(qū),可以調(diào)用這個擴(kuò)展的分段語法。
以此方式創(chuàng)建表之后,DBA_PART_TABLES 視圖中的 PARTITIONING_TYPE 列會顯示時間間隔
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的oracle 增加间隔分区,oracle分区表之间隔分区(oracle 11g) - 漫兮网的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nfc读写软件 android手机,手机
- 下一篇: 2d开源游戏引擎_前5名:构建出色的CL