將一個非分割槽錶轉換為分割槽表

tolywang發表於2008-08-02

/*
功能:
    將一個非分割槽錶轉換為分割槽表
基本思路:
    SST_DAY_TOTAL是(資料量上百萬條,列比較多)一個非分割槽表,此時建立一個與SST_DAY_TOTAL同結構的分割槽表zhaozhenlong_partition,維護資料,
刪除SST_DAY_TOTAL表,將zhaozhenlong_partition更名為SST_DAY_TOTA,刪除zhaozhenlong_partition
*/
--具體步驟:
--1、查詢非分割槽表資料
select to_char(rpt_date, 'yyyymm'), count(*) from SST_DAY_TOTAL group by to_char(rpt_date, 'yyyymm') order by to_char(RPT_DATE, 'yyyymm');

--2、建立分割槽表(結構和非分割槽表SST_DAY_TOTAL相同)
create table zhaozhenlong_partition
(
  GAS_ID                 VARCHAR2(12) not null,
  RPT_DATE               DATE not null,
  INV_NO                 VARCHAR2(12),
  ......
)
tablespace sdlg 
partition by range(rpt_date)(
partition rest values less than (maxvalue))

--3、交換資料(資料從非分割槽表到分割槽表)
alter table zhaozhenlong_partition exchange partition rest with table SST_DAY_TOTAL;

--4、查詢分割槽表資料
select to_char(RPT_DATE, 'mm-yyyy'), count(*) from SST_DAY_TOTAL group by to_char(RPT_DATE, 'mm-yyyy');

--輔助指令碼
/*
          select 'alter table zhaozhenlong_partition split partition rest at (to_date(''' 
                 || to_char(RPT_DATE, 'yyyymm') ||''',''yyyymm'')) into (partition p' 
                 || to_char(RPT_DATE, 'yyyymm')
                 || ', partition rest);'
          from zhaozhenlong_partition 
          group by to_char(RPT_DATE, 'yyyymm') 
          order by to_char(RPT_DATE, 'yyyymm')
*/

--5、對rest分割槽進行拆分
alter table zhaozhenlong_partition split partition rest at (to_date('200608','yyyymm')) into (partition p200608, partition rest);
alter table zhaozhenlong_partition split partition rest at (to_date('200609','yyyymm')) into (partition p200609, partition rest);
alter table zhaozhenlong_partition split partition rest at (to_date('200610','yyyymm')) into (partition p200610, partition rest);
alter table zhaozhenlong_partition split partition rest at (to_date('200611','yyyymm')) into (partition p200611, partition rest);
alter table zhaozhenlong_partition split partition rest at (to_date('200612','yyyymm')) into (partition p200612, partition rest);


--6、刪除非分割槽表
drop table SST_DAY_TOTAL

--7、將分割槽表重新命名為原非分割槽表名
alter table zhaozhenlong_partition rename to SST_DAY_TOTAL 

--8、刪除中間處理過程的分割槽表
drop table zhaozhenlong_partition

 

________________________________


--補充
如果已存在分割槽表,要將某未分割槽表(與已分割槽表結構完全相同)加入到分割槽中:

alter table SST_DAY_TOTAL exchange partition p200608 with table zhaozhenlong_1;
alter table SST_DAY_TOTAL exchange partition p200609 with table zhaozhenlong_2;

如果zhaozhenlong_2不符合分割槽規則,則會報錯,則需要指定without validation 來禁止檢查
alter table SST_DAY_TOTAL exchange partition p200609 with table zhaozhenlong_2 without validation;


當然,如果你確認zhaozhenlong_1表中的資料是符合分割槽規則的,那指定without validation 之後,不會對zhaozhenlong_1進行全表掃描,
則會縮短exchange時間


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

相關文章