Welcome to oracle_awen's archive blog
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  wink.gif
  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  wink.gif;

表已创建。

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
添加评论

昵称 *

E-mail (防止垃圾信息,此栏留空)