ITPub博客

首页 > 数据库 > Oracle > 普通表转分区表4方法

普通表转分区表4方法

Oracle 作者:rxdrxd1 时间:2014-01-17 14:04:02 0 删除 编辑

将普通表转换成分区表有4种方法:
  1. Export/import method 
  2. Insert with subquery method 
  3. Partition exchange method 

 

创建一个非分区表
test@CISCOSYS> create table p1(
2     id int,
3     name varchar2(32)
4  );
表已创建。
test@CISCOSYS> select count(*) from p1;
COUNT(*)
----------
10000
drop table p1;
C:Documents and SettingsAdministrator>exp test/test file=d:/p1.dmp tables=(p1);
Export: Release 10.2.0.1.0 - Production on 星期三 1月 15 15:04:21 2014
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表                              P1导出了       10000 行
EXP-00011: TEST.; 不存在
导出成功终止, 但出现警告。
create table p1(
id int,
name varchar2(32)
)
partition by range(id)
(
partition p_r_1000 values less than(1000),
partition p_r_2000 values less than(2000),
partition p_r_3000 values less than(maxvalue)
);
imp test/test file=d:/p1.dmp tables=(p1) ignore=y;
test@CISCOSYS> select count(*) from p1 partition(p_r_1000);
COUNT(*)
----------
999
test@CISCOSYS> select count(*) from p1 partition(p_r_2000);
COUNT(*)
----------
1000
test@CISCOSYS> select count(*) from p1 partition(p_r_3000);
COUNT(*)
----------
8001
转换成功

create table p2
partition by range(id)
(
partition p_r_1000 values less than(1000),
partition p_r_2000 values less than(2000),
partition p_r_3000 values less than(maxvalue)
) as select * from p1;
test@CISCOSYS>  select count(*) from p2 partition(p_r_3000);
COUNT(*)
----------
8001
test@CISCOSYS> select count(*) from p2 partition(p_r_2000);
COUNT(*)
----------
1000

test@CISCOSYS>  create table pe_old as select  * from p2;
表已创建。
注:并没将原分区结构复制过来。
test@CISCOSYS> select count(*) from pe_old;
COUNT(*)
----------
10000
创建分区表
test@CISCOSYS> create table pe_new(
2     id int,
3     name varchar2(32)
4  )
5  partition by range(id)
6  (
7     partition pe_r_5000 values less than(5000),
8     partition pe_r_10000 values less than(maxvalue)
9  );
表已创建。
下面将pe_old 中的数据 转移到pe_new数据表中
test@CISCOSYS> create table pe1 as select * from pe_old where id<5000;
表已创建。
test@CISCOSYS> create table pe2 as select * from pe_old where id>=5000;
表已创建。
test@CISCOSYS> select count(*) from pe1;
COUNT(*)
----------
4999
test@CISCOSYS> select count(*) from pe2;
COUNT(*)
----------
5001
test@CISCOSYS> alter table pe_new  exchange partition pe_r_5000 with table pe1;
表已更改。
test@CISCOSYS> alter table pe_new  exchange partition pe_r_10000 with table pe2;
表已更改。
test@CISCOSYS> select count(*) from pe_new;
COUNT(*)
----------
10000
test@CISCOSYS> select count(*) from pe1;
COUNT(*)
----------
0
test@CISCOSYS> select count(*) from pe2;
COUNT(*)
----------
0
test@CISCOSYS> select count(*) from pe_new partition(pe_r_5000);
COUNT(*)
----------
4999

创建基本表
test@CISCOSYS> create table pl_plain as select * from pe_new;
表已创建。
test@CISCOSYS> create index pl_plain_idx on pl_plain(id);
索引已创建。
创建临时的分区表
test@CISCOSYS>   create table pl_part2(
id int,
name varchar2(32)
)
partition by range(id)
(
partition pl2_r1_1000 values less than(1000),
partition pl2_r2_3000 values less than(3000),
partition pl2_r3_3000 values less than(maxvalue)
);
表已创建。
test@CISCOSYS> select count(*) from pl_plain;
COUNT(*)
----------
10000
test@CISCOSYS> exec dbms_stats.gather_table_stats("test", "pl_plain", cascade => true);
PL/SQL 过程已成功完成。
检测合理性
test@CISCOSYS> alter table pl_plain add constraint pk_plain primary key(id);
表已更改。
test@CISCOSYS> exec dbms_redefinition.can_redef_table("test", "pl_plain");
PL/SQL 过程已成功完成。
开始重定义
test@CISCOSYS> BEGIN
DBMS_REDEFINITION.start_redef_table(
uname => "TEST",
orig_table => "pl_plain",
int_table => "pl_part2",
DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQL 过程已成功完成。
同步新表
test@CISCOSYS>  BEGIN
2     dbms_redefinition.sync_interim_table(
3     uname => "TEST",
4     orig_table => "pl_plain",
5     int_table => "pl_part");
6     END;
7     /
PL/SQL 过程已成功完成。
test@CISCOSYS> select count(*) from pl_part;
COUNT(*)
----------
10000
此时分区表中数据已经同步过来了。
结束重定义 (此时基表与临时表进行了交换)
SQL> BEGIN
2    dbms_redefinition.finish_redef_table(
3    uname => "TEST",
4    orig_table => "pl_plain",
5   int_table => "pl_part");
6    END;
7    /
test@CISCOSYS> select segment_name,segment_type,PARTITION_NAME from dba_segments where segment_name like "%PLAIN%";
SEGMENT_NAME         SEGMENT_TYPE       PARTITION_NAME
-------------------- ------------------ ------------------------------
PL_PLAIN_IDX         INDEX
PL_PLAIN             TABLE PARTITION    PL_R3_3000
PL_PLAIN             TABLE PARTITION    PL_R2_3000
PL_PLAIN             TABLE PARTITION    PL_R1_1000

 

本文出自 “简单” 博客,请务必保留此出处http://dba10g.blog.51cto.com/764602/1351990


喜欢玩七位数的可以去看看这个站的七位数开奖结果查询
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23391467/viewspace-1115472/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-02-24