通过在线重定义将普通表转成分区表

来源:互联网 发布:淘宝ps美工培训班 编辑:程序博客网 时间:2024/05/20 08:01
通过在线重定义,将普通表转成分区表


SELECT * FROM TEST.TAB1; 

--查询表是否可以使用在线重定义,如果不返回任何内容,则可以


call dbms_redefinition.can_redef_table('TEST','TAB1');


--创建中间表分区表,表结构与源表一样,下面以时间分区,分区的表空间,分多少区自己定义
CREATE TABLE TEST.PARTITION_TAB1 
partition by range(basj)(
   partition basj_range_2006 values less than (to_date('2006-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss')),
   partition basj_range_2012 values less than (to_date('2012-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss')),
   partition basj_range_2018 values less than (to_date('2018-12-31 23:59:59','yyyy-mm-dd hh24:mi:ss'))
) as SELECT * FROM TEST.TAB1 where 0=1


--增加分区 表空间自己指定

--ALTER TABLE  TEST.TAB1  ADD PARTITION basj_range_2024 VALUES LESS THAN (TO_DATE('2014-12-31 23:59:59','YYYY-MM-DD HH24:MI:SS'))TABLESPACE  XXX



--开始复制源表行记录到中间表
call dbms_redefinition.start_redef_table('TEST','TAB1','PARTITION_TAB1');




--复制源表主键约束,索引到中间表,下面是在命令行执行
SET SERVEROUTPUT ON;
VARIABLE NERRORS NUMBER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ( 'TEST','TAB1','PARTITION_TAB1', NUM_ERRORS => :NERRORS );
END;




--如果源表数据有变化,可以同步到中间表
call dbms_redefinition.sync_interim_table('TEST','TAB1','PARTITION_TAB1');




--完成普通表转分区表的转换
call dbms_redefinition.finish_redef_table('TEST','TAB1','PARTITION_TAB1');





--TEST.TAB1 就转好分区表了,查询分区

SELECT * FROM TEST.TAB1 PARTITION(BASJ_RANGE_2012) ORDER BY BASJ DESC; 


具体可以研究一下 dbms_redefinition 这个包








0 0
原创粉丝点击