如何将Oracle数据库的普通表转换成分区表 (3)

上一篇 / 下一篇  2008-05-10 13:58:02

 

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)

2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),

3 PARTITION P2 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

表已更改。

SQL> RENAME T TO T_OLD;

表已重命名。

SQL> RENAME T_NEW TO T;

表已重命名。

SQL> SELECT COUNT(*) FROM T;

COUNT(*)

----------

6264

优点:

只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足:

仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。

方法三:Oracle9i以上版本,利用在线重定义功能

步骤:

SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM, CREATED FROM DBA_OBJECTS;

已创建6264行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER’, 'T', DBMS_REDEFINITION.CONS_USE_PK);

PL/SQL 过程已成功完成。

SQL> CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)

2 (PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),

3 PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),

4 PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),

5 PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW', -

> 'ID ID, TIME TIME', DBMS_REDEFINITION.CONS_USE_PK);

可以改为:

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(‘USER’, 'T', 'T_NEW')

PL/SQL 过程已成功完成。

SQL> EXEC dbms_redefinition.sync_interim_table(‘USER’, 'T', 'T_NEW')

现在,将中间表与原始表同步。(仅当要对表 T 进行更新时才需要执行该操作。)

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER’, 'T', 'T_NEW');

PL/SQL 过程已成功完成。

如果重组织失败,那么你就必须采取特殊的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。  

DBMS_REDEFINITION.ABORT_REDEF_TABLE过程有三个参数,即用户(schema)、原始表格(original table name)名称以及持有表格名称(holding table name)。它“出栈”并允许你开始重组织表格。

SQL> SELECT COUNT(*) FROM T;

SQL> SELECT COUNT(*) FROM T PARTITION (P2);

SQL> SELECT COUNT(*) FROM T PARTITION (P3);

需要说明的是完成后,原表和中间表的结构也同时进行了交换,并且中间表里面有原表的数据备份

优点:

保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足:实现上比上面两种略显复杂,适用于各种情况。

然而,在线表格重定义也不是完美无缺的。下面列出了Oracle9i重定义过程的部分限制:

你必须有足以维护两份表格拷贝的空间。   

你不能更改主键栏。   

表格必须有主键。   

必须在同一个大纲中进行表格重定义。   

在重定义操作完成之前,你不能对新加栏加以NOT NULL约束。   

表格不能包含LONG、BFILE以及用户类型(UDT)。   

不能重定义链表(clustered tables)。   

不能在SYS和SYSTEM大纲中重定义表格。   

不能用具体化视图日志(materialized view logs)来重定义表格;不能重定义含有具体化视图的表格。   

不能在重定义过程中进行横向分集(horizontal subsetting)。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-07-25  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 12951
  • 日志数: 2718
  • 图片数: 1
  • 建立时间: 2008-03-20
  • 更新时间: 2008-06-01

RSS订阅

Open Toolbar