本实验是在线使用dbms_redefinition包把大数据量非分区表转换为分区表。它适用于
Oracle Database - Enterprise Edition - Version 11.2.0.2.0 以及以后的任何版本.
本文使用DBMS_REDEFINITION包提供了大量详细的方法把普通表在线的转换为分区表。
下面是详细的操作步骤:
1. 创建一个临时的分区表,表结构与要转换的非分区表结构相同.
2. 执行 DBMS_REDEFINITION.can_redef_table...
3. 执行 DBMS_REDEFINITION.start_redef_table...
4. 执行 DBMS_REDEFINITION.sync_interim_table...
5. 执行 DBMS_REDEFINITION.finish_redef_table...
6. 删除临时的分区表 Drop the interim table.
详细的操作步骤:
本实验在 11.2.0.3平台下做的。
-- 创建非分区表,并初始化数据.
SQL>CREATE TABLE unpar_table (
a NUMBER, y number,
name VARCHAR2(100), date_used date);
-- 添加一主键
SQL>alter table unpar_table ADD (CONSTRAINT unpar_table_pk PRIMARY KEY (a,y));
-- 加载数据 1,000,000 行
SQL>begin
for i in 1 .. 1000
loop
for j in 1 .. 1000
loop
insert into unpar_table values ( i, j, dbms_random.random, sysdate-j );
end loop;
end loop;
end;
/
commit;
SQL>SELECT num_rows FROM user_tables WHERE table_name = 'UNPAR_TABLE';
NUM_ROWS
----------
1000000
Elapsed: 00:00:00.01
--创建分区表
SQL> CREATE TABLE par_table (
a NUMBER, y number,
name VARCHAR2(100),date_used DATE)
PARTITION BY RANGE (date_used)
(PARTITION unpar_table_12 VALUES LESS THAN (TO_DATE('10/07/2012', 'DD/MM/YYYY')),
PARTITION unpar_table_15 VALUES LESS THAN (TO_DATE('15/07/2012', 'DD/MM/YYYY')),
PARTITION unpar_table_MX VALUES LESS THAN (MAXVALUE));
SQL> begin
for i in 1001 .. 1010
loop
for j in 1001 .. 1100
loop
insert into unpar_table values ( i, j, dbms_random.random, sysdate-j );
end loop;
end loop;
end;
/
commit;
Elapsed: 00:00:00.24
SQL> select count(*) from MLOG$_UNPAR_TABLE;
COUNT(*)
----------
1000
-- 执行 dbms_redefinition.sync_interim_table基于物化视图 FAST REFRESH
-- 在线更新数据. 这将清空物化视图中被应用的每一条记录.
-- 在我们执行Finish_REDEF_TABLE存储过程包之前,我们可以执行多次.