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 分区准确的
谢谢你,我先试试的,呵呵。 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,这个合理么?谢谢
1)你可以先另建一新表按新的键分区,
2)然后使用insert ...select...插入数据。
3)删除原来的表。
4)使用rename将新表更改回原来的名字。
2、如果生产环境该表一直在使用,可以使用在线重定义表方式。
还是说在线把分区表变为未分区表,谢谢!
还有一个问题求教一下:我在分区的时候less than这个命令准确吗?为什么有的数据分错区了,谢谢
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 分区准确的
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,这个合理么?谢谢