本文档 ID 1985005.1
如何将oralce普通表转换为分区表,此前面试被问到过,虽然知道在线重定义,个人觉得很简单,查查文档做个试验就差不多了,但自己没亲自操作过有点心虚;这次抽点时间好好研究一下!
可以任选如下四种方法的一种来对非分区表进行分区:
A) 通过 expdp/impdp 方法
B) 通过 Insert with a subquery 方法
C) 通过 Partition Exchange 方法
D) 通过 DBMS_REDEFINITION,(在线重定义)法
以上四种方法都会从一个已经存在的非分区表创建出一个分区表。管我们已经对这四种方法的维护时间预期做了倒序排列,但实际维护时间针对不同情况有所不同。
方法一:通过 expdp/impdp 方法
1) expdp非分区表:
[oracle@node3 node3]$ expdp scott/tiger tables=numbers dumpfile=number.dmp
2) Drop 掉该非分区表:
SQL> drop table numbers;
3) 重新创建该表成为一个分区表:
create table numbers (
qty number(3),
name varchar2(15)
)
partition by range (qty)(
partition p1 values less than (200),
partition p2 values less than (400),
partition p3 values less than (600),
partition p4 values less than (maxvalue) ) ;
4) 通过 impdp 的 table_exists_action 方式来还原备份的数据:
[oracle@node3 node3]$ impdp scott/tiger file=number.dmp table_exists_action=append
而使用impdp完成数据库导入时,若表已经存在,有四种的处理方式:
1) skip :默认操作,如果表存在,则跳过
2) replace :先drop表,然后创建表,最后插入数据
3) append :在原来数据的基础上增加数据
4) truncate:先truncate,然后再插入数据
方法二: Insert with a subquery
1 ) 创建一个分区表:
create table numbers_part (
qty number(3),
name varchar2(15)
)
partition by range (qty)(
partition p1 values less than (200),
partition p2 values less than (400),
partition p3 values less than (600),
partition p4 values less than (maxvalue) ) ;
2) 将原来非分区表中的数据通过子查询 i nsert 到新创建的分区表中:
SQL> insert into numbers_part (qty, name) select * from numbers;
3) 如果您想让新建的分区表与原表名相同,那么drop 掉原来的非分区表然后重命名新表:
SQL> drop table numbers;
SQL> alter table numbers_part rename to numbers;
您可以通过 direct path insert 和利用并行来改善 in