Oracle普通表转成分区表(交换分区)

这种方法只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。适用于包含大数据量的表转到分区表中的一个分区的操作。尽量在闲时进行操作。
 
交换分区的操作步骤如下:
     1. 创建分区表,假设有2个分区,P1,P2.
     2. 创建表A存放P1规则的数据。
     3. 创建表B 存放P2规则的数据。
     4. 用表A 和P1 分区交换。 把表A的数据放到到P1分区
     5. 用表B 和p2 分区交换。 把表B的数据存放到P2分区。
 
创建分区表:
sql> create table p_dba
  2  (id number,time date)
  3  partition by range(time)
  4  (
  5  partition p1 values less than (to_date('2010-09-1', 'yyyy-mm-dd')),
  6  partition p2 values less than (to_date('2010-11-1', 'yyyy-mm-dd'))
  7  );
表已创建。
 
注意:我这里只创建了2个分区,没有创建存放其他数据的分区。
 
创建2个分别对应分区的基表:
SQL> CREATE TABLE dba_p1 as SELECT id,time_fee FROM dba_old WHERE  time_fee<TO_DATE('2010-09-1', 'YYYY-MM-DD');
表已创建。
 
SQL> CREATE TABLE dba_p2 as SELECT id,time_fee FROM dba_old WHERE  time_fee<TO_DATE('2010-11-1', 'YYYY-MM-DD') and time_fee>TO_DATE('2010-09-1', 'YYYY-MM-DD');
表已创建。
 
SQL> select count(*) from dba_p1;
  COUNT(*)
----------
   1536020
SQL> select count(*) from dba_p2;
  COUNT(*)
----------
    365932
 
SQL>
 
讲2个基表与2个分区进行交换:
SQL> alter table p_dba exchange partition p1 with table dba_p1;
表已更改。
SQL> alter table p_dba exchange partition p2 with table dba_p2;
表已更改。
 
查询2个分区:
SQL> select count(*) from p_dba partition(p1);
  COUNT(*)
----------
   1536020
SQL> select count(*) from p_dba partition(p2);
  COUNT(*)
----------
    365932
注意:数据和之前的基表一致。
 
查询原来的2个基表:
SQL> select count(*) from dba_p2;
  COUNT(*)
----------
         0
SQL> select count(*) from dba_p1;
  COUNT(*)
----------
         0
注意: 2个基表的数据变成成0。
 
在这里我们看一个问题,一般情况下,我们在创建分区表的时候,都会有一个其他分区,用来存放不匹配分区规则的数据。 在这个例子中,我只创建了2个分区,没有创建maxvalue分区。 现在我来插入一条不满足规则的数据,看结果:
 
SQL> insert into p_dba values(999999,to_date('2012-12-29','yyyy-mm-dd'));
insert into p_dba values(999999,to_date('2012-12-29','yyyy-mm-dd'))
            *
第 1 行出现错误:
ORA-14400: 插入的分区关键字未映射到任何分区
SQL> insert into p_dba values(999999,to_date('2009-12-29','yyyy-mm-dd'));
已创建 1 行。
SQL> select * from p_dba where id=999999;
 
        ID TIME
---------- --------------
    999999 29-12月-09
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> select * from p_dba where id=999999;
 
        ID TIME
---------- -------------------
    999999 2009-12-29 00:00:00
SQL>
 
通过这个测试可以清楚,如果插入的数据不满足分区规则,会报ORA-14400错误。

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

转载于:http://blog.itpub.net/31448824/viewspace-2136612/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值