首先明確分區表和表分區的區別:表分區是一種思想,分區表示一種技術實現。當表的大小過G的時候可以考慮進行表分區,提高查詢效率,均衡IO。oracle分區表是oracle資料庫提供的一種表分區的實現形式。表進行分區後,邏輯上仍然是一張表,原來的查詢SQL同樣生效,同時可以採用使用分區查詢來最佳化SQL查詢效率,不至於每次都掃描整個表
一、分區表基本操作1、按時間分區表建立:
create table t_test ( pk_id number(30) not null, add_date_time DATE, constraintPK_T_TEST primary key (pk_id))PARTITION BY RANGE (add_date_time)( PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS, PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS, PARTITION t_test_2014VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss'))TABLESPACE TS_MISPS)
其中add_date_time為分區欄位,每一年一個分區。
插入100W資料
declare i int := 1; yearVARCHAR2(20);begin loop year := CASEmod(i, 3) WHEN 0 THEN '2012-01-14 12:00:00' WHEN 1 THEN '2013-01-14 12:00:00' ELSE '2014-01-14 12:00:00' END; insert into t_test values(i, to_date(year, 'yyyy-mm-dd hh24:mi:ss')); exit when i= 1000000; i := i + 1; end loop;end;
查看分區表的分區的詳細資料
Select table_name,partition_name,high_value fromdba_tab_partitions where table_name='T_TEST';
2、分區表修改2.1增加一個分區
分兩種情況:1.沒有maxvalue分區。2.有maxvalue分區。我們建立的分區就是沒有maxValue的分區
1.沒有maxvalue分區添加新分區:
alter table t_test add partition t_test_2015 VALUESLESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) TABLESPACETS_MISPS ;
2、有maxvalue分區添加新分區:
有了maxvalue,就不能直接add partition,而是需要max分區split。例如我們將建立的分區的語句修改下:
create table t_test ( pk_id number(30) not null, add_date_time DATE, constraintPK_T_TEST primary key (pk_id))PARTITION BY RANGE (add_date_time)( PARTITIONt_test_2013_less VALUES LESS THAN (TO_DATE('2013-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS, PARTITIONt_test_2013 VALUES LESS THAN (TO_DATE('2014-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS, PARTITIONt_test_2014 VALUES LESS THAN (TO_DATE('2015-01-01 00:00:00','yyyy-mm-ddhh24:mi:ss')) TABLESPACE TS_MISPS, PARTITION t_test_maxVALUES LESS THAN (MAXVALUE))
增加一個2016年的分區語句為:
alter table t_test split partition t_test_max at(TO_DATE('2016-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')) into (partitiont_test_2015,partition t_test_max);
2.2刪除一個分區
alter table t_test drop partition t_test_2014
註:droppartition時,該分區記憶體儲的資料也將同時刪除,你的本意是希望刪除掉指定的分區但保留資料,你應該使用merge partition,執行該語句會導致glocal索引的失效需要重建全域索引
2.3合并分區
相鄰的分區可以merge為一個分區,新分區的下邊界為原來邊界值較低的分區,上邊界為原來邊界值較高的分區,原先的局部索引相應也會合并,全域索引會失效,需要rebuild。
Alter table t_test merge partitions t_test_2013 ,t_Test_2014 into partition t_Test_2013_to_2014
二、對分區表進行查詢
2.1查詢
不使用分區查詢:預設查詢所有分區資料
select * from t_test
使用分區查詢:只查詢該分區資料
select * from t_testpartition(t_test_2014) where add_date_time >=TO_DATE('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss');
2.1插入
insert into t_test values(i, to_date(year,'yyyy-mm-dd hh24:mi:ss'));
2.1刪除
使用分區刪除
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會刪除資料
delete t_test partition(t_test_2013) where id=1;
不使用分區刪除
delete t_test whereid=1;
2.1修改
使用分區更新
更新的時候指定了分區,而根據查詢的記錄不在該分區中時,將不會更新資料
delete t_test where id=1;update t_test partition(t_test) set id=1 where id=2;
不使用分區
delete t_test where id=1;update t_test set id=1 where id=2;
三、普通表和分區表互轉
普通表—>分區表
1、建立一個欄位一樣的中間的分區表(T_NEW)
2、將T資料匯入到T_NEW中
INSERT INTO T SELECT field1,filed2, …from T
將老表重新命名
RENAME T TO T_OLD;
將新表重新命名
RENAME T_NEW TO T;
這種適合靜態操作,不保證資料一致性。如果在生產環境切換,利用利用線上重定義功能