使用split對分割槽表再分割槽

myownstars發表於2011-07-28
表justin本來按月分割槽,但是進入7月份,資料量暴漲,每天都有百萬條之多,應開發要求,將其7月份及其以後的分割槽都改為按天分割槽
目前該表最大分割槽到8月1號
首先需要對7月份現有分割槽執行split操作,然後新增8月份以後的分割槽

執行split操作語法如下
alter table justin split partition p1107 at (to_date('2011-07-02','yyyy-mm-dd')) into (partition p110701,partition p1107);
該語句會使p1107和p110701上的索引全部失效,且生成大量redo

生成指令碼
declare
  v_date date;
  v_cnt number := 0;
  v_cur varchar2(5);
  v_mon varchar2(5);--number := 0;
  v_day varchar2(5);--number := 0;
begin
  v_date := to_date('2011-07-01','yyyy-mm-dd');
  for i in 1..30 loop
    v_cur := to_char(v_date,'dd');
    v_date := v_date + 1;
    v_mon := to_char(v_date,'mm');
    v_day := to_char(v_date,'dd');
    dbms_output.put_line('alter table justin split partition p1107 at (to_date(''2011-'||v_mon||'-'||v_day||''',''yyyy-mm-dd'')) into (partition p11'||v_mon||v_cur||',partition p1107);');
    dbms_output.put_line('exec dbms_lock.sleep(10);');
  end loop;
end;
生成的指令碼如下
alter table justin split partition p1107 at (to_date('2011-07-30','yyyy-mm-dd')) into (partition p110729,partition p1107);
exec dbms_lock.sleep(10);
alter table justin split partition p1107 at (to_date('2011-07-31','yyyy-mm-dd')) into (partition p110730,partition p1107);
exec dbms_lock.sleep(10);

執行完畢後 需要重建索引
declare
begin
  for i in (select index_name,table_name from user_indexes where status ='UNUSABLE') loop
    execute immediate 'alter index '||i.index_name||' rebuild online';
  end loop;
  for j in (select u.index_name,u.partition_name,ui.table_name from user_ind_partitions u,user_indexes ui where u.status ='UNUSABLE' and u.index_name = ui.index_name) loop
    execute immediate 'alter index '||j.index_name|| ' rebuild partition '||j.partition_name||' online';
  end loop;
end;


該表到8月1號過期,為其新增一年的分割槽
declare
  v_date date;
  v_cnt number := 0;
  v_year varchar2(2);
  v_curday varchar2(2);
  v_mon varchar2(2);--number := 0;
  v_day varchar2(2);--number := 0;
begin
  v_date := to_date('2011-08-01','yyyy-mm-dd');
  for i in 1..365 loop
    v_year := to_char(v_date,'yy');
    v_curday := to_char(v_date,'dd');
    v_date := v_date + 1;
    v_mon := to_char(v_date,'mm');
    v_day := to_char(v_date,'dd');
    dbms_output.put_line('alter table justin add partition P'||v_year||v_mon||v_curday||' values less than (to_date(''20'||v_year||'-'||v_mon||'-'||v_day||''',''yyyy-mm-dd''));');-- into (partition p11'||v_mon||v_curday||',partition p1107);');
   end loop;
end;
輸出結果如下
alter table justin add partition P110801 values less than (to_date('2011-08-02','yyyy-mm-dd'));
alter table justin add partition P110802 values less than (to_date('2011-08-03','yyyy-mm-dd'));
alter table justin add partition P110803 values less than (to_date('2011-08-04','yyyy-mm-dd'));

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-703351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章