交换分区!

直白的说就是迁移数据。Exchange partition提供了一种方式,让你在表与表或分区与分区之间迁移数据,注意不是将表转换成分区或非分区的形式,而仅只是迁移表中数据(互相迁移),由于其号称是采用了更改数据字典的方式,因此效率最高(几乎不涉及io操作)。Exchange partition适用于所有分区格式,你可以将数据从分区表迁移到非分区表,也可以从非分区表迁移至分区表,或者从hash partition到range partition诸如此类吧。
其语法很简单:alter table tbname1 exchange partition/subpartition ptname with table tbname2;

 

借用前文中创建的空分区表:t_partition_range,并插入几条记录:

SQL> insert into t_partition_range values (11,'a');

已创建 1 行。

SQL> insert into t_partition_range values (12,'b');

已创建 1 行。

SQL> insert into t_partition_range values (13,'c');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t_partition_range;

        ID NAME
---------- --------------------------------------------------
        11 a
        12 b
        13 c


再创建一个非分区表,结构与t_partition_range相同

SQL> create table t_partition_range_tmp as select * from t_partition_range where 1=0;

表已创建。

SQL> select * from t_partition_range_tmp;

未选定行


执行交换分区(我们知道刚插入到range分区表的数据都在分区t_range_p2中,因此这里指定交换该分区)

SQL> alter table t_partition_range exchange partition t_range_p2 with table t_partition_range_tmp;

表已更改。

SQL> select * from t_partition_range partition(t_range_p2);

未选定行

SQL> select * from t_partition_range_tmp;

        ID NAME
---------- --------------------------------------------------
        11 a
        12 b
        13 c

 

记录成功交换到未分区的表中。我们再执行一次exchange partition的命令,看看又会发生什么呢

SQL> alter table t_partition_range exchange partition t_range_p2 with table t_partition_range_tmp;

表已更改。

SQL> select * from t_partition_range partition(t_range_p2);

        ID NAME
---------- --------------------------------------------------
        11 a
        12 b
        13 c

SQL> select * from t_partition_range_tmp;

未选定行

 

又交换回来了,有点儿意思。再做个更加明确的测试,我们往未分区的表中加入一些记录后再执行exchange partition,看看会发生什么呢:

SQL> insert into t_partition_range_tmp values (15,'d');

已创建 1 行。

SQL> insert into t_partition_range_tmp values (16,'e');

已创建 1 行。

SQL> insert into t_partition_range_tmp values (17,'d');

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter table t_partition_range exchange partition t_range_p2 with table t_partition_range_tmp;

表已更改。

SQL> select * from t_partition_range partition(t_range_p2);

        ID NAME
---------- --------------------------------------------------
        15 d
        16 e
        17 d

 

这就是前面所说的,互相交换的意思~~注意:
 涉及交换的两表之间表结构必须一致,除非附加with validation子句;
 如果是从非分区表向分区表做交换,非分区表中的数据必须符合分区表中指定分区的规则,除非附加without validation子句;
 如果从分区表向分区表做交换,被交换的分区的数据必须符合分区规则,除非附加without validation子句;
 Global索引或涉及到数据改动了的global索引分区会被置为unusable,除非附加update indexes子句。
提示:一旦附加了without validation子句,则表示不再验证数据有效性,因此指定该子句时务必慎重。

 

例如:

SQL> insert into t_partition_range_tmp values (8,'g');

已创建 1 行。

SQL> commit;

提交完成。

SQL> alter table t_partition_range exchange partition t_range_p2 with table t_partition_range_tmp without validation;

表已更改。

SQL> select *from t_partition_range partition(t_range_p2);

        ID NAME
---------- --------------------------------------------------
        11 a
        12 b
        13 c
         8 g

虽然新插入的记录并不符合t_range_p2分区的范围值,但指定了without validation后,数据仍然转换成功。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值