暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

将表转换为分区表——CTAS、交换分区

原创 章芋文 2012-04-16
1679
1、CTAS
适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。


不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。





代码:
SQL> select * from a3;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> desc a3;
名称 是否为空? 类型
----------------------------------------- -------- -------------------------

ID NUMBER


SQL> ed
已写入 file afiedt.buf

1 create table a3_new partition by range(id)
2 (
3 partition pa values less than(100),
4 partition pb values less than(maxvalue)
5 )
6* as select * from a3
SQL> /

表已创建。

SQL> select * from a3_new;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> rename a3 to a3_old;

表已重命名。

SQL> rename a3_new to a3;

表已重命名。


SQL> select count(*) from a3;

COUNT(*)
----------
9


SQL> select * from a3 partition(pa);

ID
----------
1
1
1
1
1
1
1
1

已选择8行。

SQL> select * from a3 partition(pb);

ID
----------
100

SQL> select * from a3;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。


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

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


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





代码:
SQL> drop table a3;

表已删除。

SQL> rename a3_old to a3;

表已重命名。

SQL>
SQL> select * from a3;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> select * from a3 partition(pa);
select * from a3 partition(pa)
*
第 1 行出现错误:
ORA-14501: 对象未分区


SQL> create table a3_new(id number) partition by range(id)
2 (
3 partition pa values less than (1000),
4 partition pb values less than (maxvalue)
5 );

表已创建。

SQL> alter table a3_new exchange partition pa with table a3;

表已更改。

SQL> select * from a3_new;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> select * from a3;

未选定行

SQL> rename a3 to a3_old;

表已重命名。

SQL> rename a3_new to a3;

表已重命名。

SQL> select * from a3;

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> insert into a3 values(1001);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from a3 partition(pa);

ID
----------
1
1
1
1
1
1
1
1
100

已选择9行。

SQL> select * from a3 partition(pb);

ID
----------
1001
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论