您好,欢迎访问一九零五行业门户网

使用在线重定义方式将普通表转换成分区表

1、创建一张普通表(源表:li.p_table) create table li.p_table(id_n number,date_n date); 2、向源表插入数据 insert into li.p_table values (1,to_date(2013-01-02 01:01:01,yyyy-mm-dd hh24:mi:ss)); insert into li.p_table values (2,to_date(2013-0
1、创建一张普通表(源表:li.p_table)
create table li.p_table(id_n number,date_n date);
2、向源表插入数据
insert into li.p_table values (1,to_date('2013-01-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (2,to_date('2013-02-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (3,to_date('2013-03-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (4,to_date('2013-04-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (5,to_date('2013-05-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (6,to_date('2013-06-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (7,to_date('2013-07-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (8,to_date('2013-08-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (9,to_date('2013-09-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (10,to_date('2013-10-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (11,to_date('2013-11-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (12,to_date('2013-12-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (13,to_date('2014-01-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
insert into li.p_table values (14,to_date('2014-02-02 01:01:01','yyyy-mm-dd hh24:mi:ss'));
commit;
3、创建一张临时分区表
创建的临时分区表的表结构必须与源表保持一致
create table li.p_partion_table(id_n number,date_n date)
partition by range (date_n)
(partition p_201301 values less than (to_date('2013-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201302 values less than (to_date('2013-03-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201303 values less than (to_date('2013-04-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201304 values less than (to_date('2013-05-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201305 values less than (to_date('2013-06-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201306 values less than (to_date('2013-07-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201307 values less than (to_date('2013-08-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201308 values less than (to_date('2013-09-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201309 values less than (to_date('2013-10-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201310 values less than (to_date('2013-11-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201311 values less than (to_date('2013-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201312 values less than (to_date('2014-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition p_201401 values less than (to_date('2014-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss')),
partition maxvalue values less than (maxvalue));
4、检测源表(li.p_table)是否可以在线重定义(以rowid方式)
exec dbms_redefinition.can_redef_table(uname=>'li',tname=>'p_table',options_flag=>dbms_redefinition.cons_use_rowid);
如果由于某种原因不能在线重定义,则会报出相应错误提示。
(1)对于无主键的表,在使用dbms_redefinition.can_redef_table检测表是否可以在线重定义时,指定以rowid方式确定数据的唯一行性
(2)对于有主键的表,在使用dbms_redefinition.can_redef_table检测表是否可以在线重定义时,指定以cons_use_pk方式确定数据的唯一行性
5、将源表的数据交换到临时表
exec dbms_redefinition.start_redef_table(uname=>'li',orig_table=>'p_table',int_table=>'p_partion_table',options_flag=>dbms_redefinition.cons_use_rowid);
6、将源表转换成分区表
exec dbms_redefinition.finish_redef_table(uname=>'li',orig_table=>'p_table',int_table=>'p_partion_table');
7、查看源表(li.p_table)的分区状态
select table_owner,table_name,partition_name from dba_tab_partitions where table_name='p_table' and table_owner='li'
结果如下:
li p_table maxvalue
li p_table p_201301
li p_table p_201302
li p_table p_201303
li p_table p_201304
li p_table p_201305
li p_table p_201306
li p_table p_201307
li p_table p_201308
li p_table p_201309
li p_table p_201310
li p_table p_201311
li p_table p_201312
li p_table p_201401
以上说明,到此步为止,源表li.p_table已经从非分区表转换成了按月分区的时间范围分区表
8、查看源表(li.p_table)各个分区的数据分布情况
select * from li.p_table partition (p_201301);
结果:
1 2013/1/2 1:01:01
select * from li.p_table partition (p_201303);
结果:
3 2013/3/3 1:01:01
说明,已经重定义成了分区表,而且数据还全部按照分区范围进行了分区存放
9、查看临时表(li.p_partion_table)的分区状态
select table_owner,table_name,partition_name from dba_tab_partitions where table_name='p_partion_table' and table_owner='li'
结果:空
select owner,table_name,partitioned from dba_tables where table_name='p_partion_table' and owner='li';
结果:
li p_partion_table no
原本创建的临时分区表名,这时已经是一张非分区表了。
另有一点需要注意:sys用户下的表,是不允许重定义的。
本文为“踩点”原作,转发请说明出处!
其它类似信息

推荐信息