[Oracle] 探讨分区(4) - 分区管理

分区添加

新的分区只能添加到末尾,如果需要添加分区到前面或中间,需要使用分区分裂。
ALTER TABLE p95169.order_info add PARTITION pmax VALUES LESS THAN ( MAXVALUE ) tablespace bigdata;

分区交换

分区交换是Oracle提供的一种用于分区表和非分区表间迁移数据的方法,它只操作数据字典,不移动数据的物理存储,因此效率非常高。

它的语法如下:

alter table partition_tbl exchange partition with table nonpartition_tbl;
注意:分区表和非分区表之间无法直接交换,必须借助一个中间表(非分区),下面看一个例子:

现在有两张表:error_order_info和error_order_info_his,这两张表是表结构一模一样的分区表,现要求把一个分区p2012从error_order_info迁移到error_order_info_his。

首先,我们需要创建一个非分区的中间表,如下所示:

SYS@PROD> create table error_order_info_temp tablespace bigdata as select * from error_order_info where rownum<1;

Table created.

接着,进行两次分区交换即可。

SYS@PROD> alter table error_order_info exchange partition p2012 with table error_order_info_temp UPDATE GLOBAL INDEXES;

Table altered.

SYS@PROD> alter table error_order_info_his exchange partition p2012 with table error_order_info_temp UPDATE GLOBAL INDEXES;

Table altered.

最后,记得把中间表删除:

SYS@PROD> drop table error_order_info_temp;

Table dropped.

注意:分区交换之后,分区表上的全局索引将处于UNUSABLE的状态,需要重建。

如果出现以下错误,通常是因为临时表上没有唯一索引(包含主键),需要在临时表上创建和分区表一模一样的唯一索引和主键索引。

ERROR at line 1:
ORA-14130: UNIQUE constraints mismatch in ALTER TABLE EXCHANGE PARTITION

分区分裂

对于范围分区索引来说,新分区只能添加在末尾,如果你想在开头或中间添加分区,需要采用分区分裂的方法。
所谓分区分裂时指把原来的一个分区分成两个新的分区,下面看一个例子:
PARTITION BY RANGE (ORDERCREATEDTIME) (  
  .......
  PARTITION P201312 VALUES LESS THAN ('20140101'),  
  PARTITION PMAX VALUES LESS THAN (MAXVALUE)  
  )  
上面是分区表error_order_info当前的分区定义,由于2014年快到了,我们需要增加2014年的分区,做如下操作:
ALTER TABLE p95169.error_order_info  
      SPLIT PARTITION pmax at ('20140201') 
      INTO ( PARTITION p201401, PARTITION pmax);
这样操作成功后,将把原有的pmax分区分裂成新的p201401和pmax,如下所示:
PARTITION BY RANGE (ORDERCREATEDTIME) (  
  .......
  PARTITION P201312 VALUES LESS THAN ('20140101'),  
  PARTITION P201401 VALUES LESS THAN ('20140201'), 
  PARTITION PMAX VALUES LESS THAN (MAXVALUE)  
  )  

分区合并

分区合并是指把2个分区(不是多个分区)合并成一个新的分区:
alter table his.error_order_info
merge partitions p201301,p2013 into partition p2013 update indexes;
有两点需要注意:
1)如果分区有数据,合并后全局索引会失效,需要重建索引或加上update indexes
2)新分区的名字可以等于老分区中比较大的那个,但不能等于比较小的那个。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值