本来我按照commitedate分区,现在想换成按照createdate分区,可行吗?

解决方案 »

  1.   

    1、没有直接更改分区键的语句。
    1)你可以先另建一新表按新的键分区,
    2)然后使用insert ...select...插入数据。
    3)删除原来的表。
    4)使用rename将新表更改回原来的名字。
    2、如果生产环境该表一直在使用,可以使用在线重定义表方式。
      

  2.   

    那生产系统不一直在用分区表吗?创建的新表数据如何同步?
    还是说在线把分区表变为未分区表,谢谢!
    还有一个问题求教一下:我在分区的时候less than这个命令准确吗?为什么有的数据分错区了,谢谢
      

  3.   

    在线重定义表
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 
    Connected as test
     
    SQL> 
    SQL> --原分区表(按id分区)
    SQL> create table p(id number , name varchar2(10))
      2  partition by range(id)
      3  (
      4  partition p1 values less than(10),
      5  partition p2 values less than(20)
      6  );
     
    Table created
    SQL> --在线重定义,原表上必须要有主键
    SQL> alter table p add constraint pk_p primary key(id);
     
    Table altered
    SQL> insert into p values(1,'aaa');
     
    1 row inserted
    SQL> insert into p values(11,'bbb');
     
    1 row inserted
    SQL> select * from p partition (p1);
     
            ID NAME
    ---------- ----------
             1 aaa
    SQL> select * from p partition (p2);
     
            ID NAME
    ---------- ----------
            11 bbb
    SQL> --在线重定义临时表,按name分区
    SQL> create table p_tmp (id number,name varchar2(10))
      2  partition by range(name)
      3  (
      4  partition n1 values less than('b'),
      5  partition n2 values less than('c')
      6  );
     
    Table created
    SQL> --是否能重定义
    SQL> exec dbms_redefinition.can_redef_table(user,'p');
     
    PL/SQL procedure successfully completed
    SQL> --开始重定义
    SQL> exec dbms_redefinition.start_redef_table(user,'p','p_tmp');
     
    PL/SQL procedure successfully completed
    SQL> --同步
    SQL> exec dbms_redefinition.sync_interim_table(user,'p','p_tmp');
     
    PL/SQL procedure successfully completed
    SQL> --重定义结束
    SQL> exec dbms_redefinition.finish_redef_table(user,'p','p_tmp');
     
    PL/SQL procedure successfully completed
    SQL> --查看原表已被重定义
    SQL> select * from p;
     
            ID NAME
    ---------- ----------
             1 aaa
            11 bbb
    SQL> select * from p partition (n1);
     
            ID NAME
    ---------- ----------
             1 aaa
    SQL> select * from p partition (n2);
     
            ID NAME
    ---------- ----------
            11 bbb
     
    SQL> less than 分区准确的
      

  4.   

    谢谢你,我先试试的,呵呵。
    partition rest1 values less than (to_date('20040404','yyyymmdd')),
    partition rest2 values less than (to_date('20060606','yyyymmdd')),
    partition rest3 values less than (to_date('20080808','yyyymmdd')),
    partition rest4 values less than (maxvalue));
    我分区用这种格式可以么?为什么有一小部分的数据分区不对呢?
    rest1里有5%的分区有问题,其他三个分区里问题数据大概为1/10000,这个合理么?谢谢
      

  5.   

    恩,那我之前犯了一个错误,就是新建中间表的时候把storage等一些参数都写了进去。这样会不会导致分区的时候有问题呢?正在测试中但不知道为什么呢?谢谢