ITPub博客

首页 > 数据库 > Oracle > 交换分区

交换分区

原创 Oracle 作者:onejq 时间:2015-01-20 23:35:56 0 删除 编辑
     交换分区提供了分区与表之间直接交换数据方式
     由于
交换分区号称只是修改字典,几乎没有IO所以效率非常高    
    交换分区可以在分区表和非分区表之间直接交换数据(分区表之间交换数据没有查到可以直接交换数据的方法,可以通过中间表进行)
    另外,分区表与非分区表之间交换数据前提是两个表的字段要一致;两个表的数据要全部满足对方约束,否则失败
    当然也可以不验证数据添加without validation,但添加without validation会使查询数据不准确

1、非分区表数据不满足分区表交换分区的限制

创建分区表
    create table test001 (id number,name varchar2(50)) 
  partition by range(id)( 
  partition test_p1 values less than (10)  , 
  partition test_p2 values less than (20)  , 
  partition test_p3 values less than (30)  , 
  partition test_pmax values less than (maxvalue)   
  );    
插入数据
insert into test001 values (11,'a');
insert into test001 values (12,'b');
insert into test001 values (13,'c');
查看数据插入情况
select * from test001 partition(test_p2);
创建非分区表
CREATE TABLE test002 AS SELECT * FROM test001 WHERE 1=3;
插入非分区表数据
insert into test002 values (23,'c');
交换数据
alter table test001 exchange partition test_p2  with table test002;
报ORA-14099错误
原因是test002数据不符合test001  分区test_p2的条件
2、不验证数据导入,导致查询不准确
alter table test001 exchange partition test_p2  with table test002 WITHOUT Validation;
查询test001有id为23记录
SELECT * FROM test001
但添加条件后查不到
SELECT * FROM test001 where id>20;
因为id>20是要到test_p3去找的数据,但test_p3显然没有数据

所以不建议使用without validation
3、字段不一致添加without validation也失败
ALTER TABLE test002 ADD cc INT;
TRUNCATE TABLE test002;
alter table test001 exchange partition test_p2  with table test002 WITHOUT Validation;
ORA-14096字段数不一致
4、
显然两个分区表之间是可以通过非分区表为中间表进行

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14888950/viewspace-1408767/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-01-19

  • 博文量
    10
  • 访问量
    18122