1. 組合分區(qū)表的創(chuàng)建方式("范圍-哈稀"),見附1
成都創(chuàng)新互聯(lián)公司是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序開發(fā),十年建站對成都生料攪拌車等多個方面,擁有多年建站經(jīng)驗。
2. 樓主的需求,即"范圍-范圍分區(qū)",在ORACLE 9i, 10g經(jīng)過測試都是不能實現(xiàn)的
在附1的基礎(chǔ)上修改為"范圍-范圍"組合分區(qū),創(chuàng)建時報錯:ORA-14151:無效的表分區(qū)方法
3. 關(guān)于sxdtgsh兄的回答,我測了
3.1 沒有maxvalue上限分區(qū)設(shè)置,在插入超出分區(qū)的數(shù)據(jù)時會報錯ORA-14400: 插入的分區(qū)關(guān)鍵字未映射到任何分區(qū)
3.2 按回答的語句創(chuàng)建分區(qū)表沒有問題,但數(shù)據(jù)無法按照樓主的需求分布
====附1
附錄:創(chuàng)建"范圍-哈稀"組合分區(qū)表
CREATE TABLE TAB11 (ID NUMBER,DT DATE)
PARTITION BY RANGE (DT)
SUBPARTITION BY HASH (ID) SUBPARTITIONS 2 -- 自分區(qū)個數(shù),可以不寫,由系統(tǒng)判斷
(
PARTITION Y2012 VALUES LESS THAN (TO_DATE('2013-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2012_H1
,SUBPARTITION Y2012_H2
)
,PARTITION Y2013 VALUES LESS THAN (TO_DATE('2014-01-01','YYYY-MM-DD'))
(
SUBPARTITION Y2013_H1
,SUBPARTITION Y2013_H2
)
,PARTITION YMAX VALUES LESS THAN (MAXVALUE)
(
SUBPARTITION YMAX_H1
,SUBPARTITION YMAX_H2
)
)
====附2,請樓主檢查最后查詢的數(shù)據(jù)分布
create table T_TEST
(
ID NUMBER(20) NOT NULL,
TIME DATE NOT NULL
)
partition by range(TIME, ID) -- 按時間、ID范圍分區(qū) 這個例子是按年的
(
partition P_2012_10 values less than (to_date('2013-01-01','yyyy-MM-dd'), 10),
partition P_2012_20 values less than (to_date('2013-01-01','yyyy-MM-dd'), 20),
partition P_2012_MAX values less than (to_date('2013-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_2013_10 values less than (to_date('2014-01-01','yyyy-MM-dd'), 10),
partition P_2013_20 values less than (to_date('2014-01-01','yyyy-MM-dd'), 20),
partition P_2013_MAX values less than (to_date('2014-01-01','yyyy-MM-dd'), MAXVALUE),
partition P_MAX values less than (MAXVALUE,MAXVALUE)
);
INSERT INTO T_TEST VALUES (1,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (32,TO_DATE('20121204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (2,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (12,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (33,TO_DATE('20131204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (3,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (23,TO_DATE('20141204 00:00:00','YYYYMMDD HH24:MI:SS'));
INSERT INTO T_TEST VALUES (43,TO_DATE('20151204 00:00:00','YYYYMMDD HH24:MI:SS'));
SELECT * FROM T_TEST;
SELECT * FROM T_TEST PARTITION(P_2012_10);
SELECT * FROM T_TEST PARTITION(P_2012_20);
SELECT * FROM T_TEST PARTITION(P_2012_MAX);
SELECT * FROM T_TEST PARTITION(P_2013_10);
SELECT * FROM T_TEST PARTITION(P_2013_20);
SELECT * FROM T_TEST PARTITION(P_2013_MAX);
SELECT * FROM T_TEST PARTITION(P_MAX);
在Oracle10g中,沒有定義間隔分區(qū),只能通過范圍分區(qū)實現(xiàn)間隔分區(qū)功能,如果要實現(xiàn)自動創(chuàng)建分區(qū),只能通過創(chuàng)建JOB或者scheduler來實現(xiàn);而在11g中,Oracle直接提供了間隔分區(qū)功能,大大簡化了間隔分區(qū)的實現(xiàn)。
----注:oracle11g雖然可以自動分區(qū),但是分區(qū)的名字不能自定義,對于需要定時刪除分區(qū)時沒法處理,不如通過時間范圍來手工分區(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ū)功能,對于使用Range分區(qū)的可以按年,月,日來自動生成分區(qū)。
2、2019-08-01前的數(shù)據(jù)(包含8月份的數(shù)據(jù))會放入hip_log_node_partition?分區(qū),8月1日后的數(shù)據(jù)每月只要有數(shù)據(jù),就會自動創(chuàng)建一個分區(qū)。也就是從9月開始,開始新建分區(qū)。
3、interval函數(shù)--將數(shù)值按標準換算為日期
numtodsinterval、numtodsinterval函數(shù),將數(shù)字轉(zhuǎn)成年月,時分秒
詳見:
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索引時必須加上分區(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ū)還在。
oracle暫時沒有這個功能。
關(guān)于你說的“oracle分區(qū)表還是不能解決幾百億數(shù)據(jù)存量下的插入性能”是什么意思?是將數(shù)據(jù)插入這么多記錄的表上性能無法保證,還是太大并發(fā)會導致性能問題?
另外,如果你的并發(fā)不太大,而且還想實現(xiàn)分表,可以通過觸發(fā)器實現(xiàn)啊
其實不需要拆分表,分區(qū)就可以,還是原來的表名,只是將原來的表分成了若干的分區(qū),這樣能起到分表的效果,還不用分成很多的表。
比如你原來的表的名字是A,那么將該表改為A1,然后從新建立一個分區(qū)表A,分區(qū)的依據(jù)是班級,也就是list分區(qū),也就是一般意義上的列表分區(qū)表。
然后再將A1的數(shù)據(jù)插入新A表就可以了。
至于分區(qū)表的建立方式,往上很多,可以自行查找。
這樣操作查詢的語句不需要變,只是在不跨分區(qū)查詢的情況下,相當于分成了若干張表去查詢。比如查詢1班的成績,那么就是在1班的分區(qū)內(nèi),不會有2班的問題,就相當于你用一個指頭就能解決問題,不會動用這個手一樣。
如果分表的話,那么假設(shè)有12個班,那么就要建立12張表,這樣的話,語句就要寫12次,冗余太大了。