使用Dbms_Redefinition转换普通表-》分区表

 

SQL>  CREATE TABLE unpar_table (
  2  id NUMBER(10),
  3  create_date DATE,
  4  name VARCHAR2(100)
  5  );

Table created.

SQL> ALTER TABLE unpar_table ADD (
  2  CONSTRAINT unpar_table_pk PRIMARY KEY (id)
  3  );


Table altered.

SQL> SQL> CREATE INDEX create_date_ind ON unpar_table(create_date);

Index created.

SQL>  EXEC DBMS_STATS.gather_table_stats(USER, 'unpar_table', cascade => TRUE);

PL/SQL procedure successfully completed.

SQL> CREATE TABLE par_table (
  2  id NUMBER(10),
  3  create_date DATE,
  4  name VARCHAR2(100)
  5  )
  6  PARTITION BY RANGE (create_date)
  7  (PARTITION unpar_table_2005 VALUES LESS THAN (TO_DATE('01/01/2005', 'DD/MM/YYYY')),
  8  PARTITION unpar_table_2006 VALUES LESS THAN (TO_DATE('01/01/2006', 'DD/MM/YYYY')),
  9  PARTITION unpar_table_2007 VALUES LESS THAN (MAXVALUE));

Table created.

SQL>  EXEC Dbms_Redefinition.can_redef_table(USER, 'unpar_table');

PL/SQL procedure successfully completed.

SQL> BEGIN
  2  DBMS_REDEFINITION.start_redef_table(
  3  uname => USER, 
  4  orig_table => 'unpar_table',
  5  int_table => 'par_table');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> BEGIN
  2  dbms_redefinition.sync_interim_table(
  3  uname => USER, 
  4  orig_table => 'unpar_table',
  5  int_table => 'par_table');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>  ALTER TABLE par_table ADD (
  2  CONSTRAINT unpar_table_pk2 PRIMARY KEY (id)
  3  );


Table altered.

SQL> SQL> CREATE INDEX create_date_ind2 ON par_table(create_date);

Index created.

SQL> EXEC DBMS_STATS.gather_table_stats(USER, 'par_table', cascade => TRUE);

PL/SQL procedure successfully completed.

SQL>  BEGIN
  2  dbms_redefinition.finish_redef_table(
  3  uname => USER,
  4  orig_table => 'unpar_table',
  5  int_table => 'par_table');
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL> DROP TABLE par_table; 

Table dropped.

SQL> ALTER TABLE unpar_table RENAME CONSTRAINT unpar_table_pk2 TO unpar_table_pk;

Table altered.

SQL> ALTER INDEX create_date_ind2 RENAME TO create_date_ind;

Index altered.


SQL> desc unpar_table
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(10)
 CREATE_DATE                                        DATE
 NAME                                               VARCHAR2(100)


SQL> SELECT partition_name
  2  FROM user_tab_partitions
  3  WHERE table_name ='UNPAR_TABLE';

PARTITION_NAME
------------------------------
UNPAR_TABLE_2005
UNPAR_TABLE_2006
UNPAR_TABLE_2007

SQL> SELECT partitioned
  2  FROM user_tables
  3  WHERE table_name ='UNPAR_TABLE';

PAR
---
YES

 

11g的Dbms_Redefinition增强了很多:

1.Online table redefinition supports tables with materialized views and view logs

2.Online table redefinition supports triggers with ordering dependency

3.Minimizing dependent recompilations

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值