Oracle按時間創建分區表

jopen 10年前發布 | 15K 次閱讀 Oracle 數據庫服務器

首先明確分區表和表分區的區別:表分區是一種思想,分區表示一種技術實現。當表的大小過G的時候可以考慮進行表分區,提高查詢效率,均衡IO。oracle分區表是oracle數據庫提供的一種表分區的實現形式。表進行分區后,邏輯上仍然是一張表,原來的查詢SQL同樣生效,同時可以采用使用分區查詢來優化SQL查詢效率,不至于每次都掃描整個表</span>

一、分區表基本操作

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;

這種適合靜態操作,不保證數據一致性。如果在生產環境切換,利用利用在線重定義功能

 

來自:http://blog.csdn.net/shanhuhau/article/details/19807469

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!