在Oracle10g中,沒有定義間隔分區(qū),只能通過范圍分區(qū)實(shí)現(xiàn)間隔分區(qū)功能,如果要實(shí)現(xiàn)自動(dòng)創(chuàng)建分區(qū),只能通過創(chuàng)建JOB或者scheduler來實(shí)現(xiàn);而在11g中,Oracle直接提供了間隔分區(qū)功能,大大簡(jiǎn)化了間隔分區(qū)的實(shí)現(xiàn)。
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、武川ssl等。為近1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的武川網(wǎng)站制作公司
----注:oracle11g雖然可以自動(dòng)分區(qū),但是分區(qū)的名字不能自定義,對(duì)于需要定時(shí)刪除分區(qū)時(shí)沒法處理,不如通過時(shí)間范圍來手工分區(qū)。詳見
create table HIP_LOG_NODE_Part
(
ID?????????????????? VARCHAR2(32)???????? not null,
RECORD_TIME????????? DATE
)tablespace TB_HIP_LOG_NODE
PARTITION BY RANGE (RECORD_TIME) interval (numtoyminterval(1, 'month'))
STORE IN (TB_HIP_LOG_NODE)
(
partition hip_log_node_partition values less than (to_date('2019-08-01 00:00','yyyy-MM-dd HH24:mi')) tablespace TB_HIP_LOG_NODE
);
1、Oracle11g有間隔分區(qū)功能,對(duì)于使用Range分區(qū)的可以按年,月,日來自動(dòng)生成分區(qū)。
2、2019-08-01前的數(shù)據(jù)(包含8月份的數(shù)據(jù))會(huì)放入hip_log_node_partition?分區(qū),8月1日后的數(shù)據(jù)每月只要有數(shù)據(jù),就會(huì)自動(dòng)創(chuàng)建一個(gè)分區(qū)。也就是從9月開始,開始新建分區(qū)。
3、interval函數(shù)--將數(shù)值按標(biāo)準(zhǔn)換算為日期
numtodsinterval、numtodsinterval函數(shù),將數(shù)字轉(zhuǎn)成年月,時(shí)分秒
詳見:
4、查看表分區(qū) select table_name,partition_name from user_tab_partitions where table_name='INTERVAL_SALES';
5、插入數(shù)據(jù)再次查看分區(qū),詳見:
6、修改分區(qū)、合并分區(qū)、拆分分區(qū),詳見 :
7、創(chuàng)建索引(分區(qū)索引、全局索引) :
非分區(qū)字段創(chuàng)建主鍵,則創(chuàng)建主鍵local索引時(shí)必須加上分區(qū)字段
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主鍵字段,分區(qū)字段) USING INDEX LOCAL;
8、oracle 10g創(chuàng)建表分區(qū)
9、刪除
1.不保留,直接刪除:
alter table table_name drop/truncate partition partition_name;
具體用drop還是truncate,得你自己衡量,drop的話原來的分區(qū)和數(shù)據(jù)直接就沒有了,truncate的話,只是數(shù)據(jù)沒有了,分區(qū)還在。
沒有日期字段就用其他的分區(qū)方式。
我們用日期分區(qū)主要是把每月的數(shù)據(jù)放在一個(gè)分區(qū),那么如果沒有分區(qū)字段,那么我們就需要用其他的字段分區(qū)了,比如hash分區(qū)(這個(gè)是自動(dòng)分區(qū),直接將table分成若干個(gè)區(qū)域,數(shù)據(jù)會(huì)根據(jù)字段hash值自動(dòng)分配到某個(gè)區(qū)域),列表分區(qū)(根據(jù)表中的某個(gè)字段去進(jìn)行分區(qū),比如某城有四個(gè)區(qū)域,那么正好用這四個(gè)值去分區(qū)就可以了)。
如果有其他的數(shù)字字段,那么看看這些數(shù)字字段能不能用,如果能用也可以用范圍分區(qū),不一定非要是日期字段的。
--建表
create table t_temp_01 (
t_date varchar2(10),
t_num number(10)
)
partition by list (t_date)
(partition p_20150726 values ('20150726'),
partition p_20150809 values ('20150809'),
partition p_20150810 values ('20150810')
);
--查詢15天前日期
select sysdate - 15 from dual;
--插入數(shù)據(jù)
insert into t_temp_01 values ('20150726',1) ;
insert into t_temp_01 values ('20150809',2) ;
insert into t_temp_01 values ('20150810',3) ;
commit;
--查詢數(shù)據(jù)
select * from t_temp_01 ;
--truncate表的15天前分區(qū)
declare
v_sql varchar(500) := '';
begin
v_sql := 'alter table t_temp_01 truncate partition p_' || to_char(sysdate - 15 ,'yyyymmdd') ;
dbms_output.put_line(v_sql);
execute immediate v_sql ;
end ;
select * from t_temp_01 ;