• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Oracle表分区的创建、新增、拆分

武飞扬头像
大宇进阶之路
帮助1

Oracle中为了方便管理、查询数据当数据量大于500w或者2G时最好用分区表,常见的一种是使用时间作为分区。

分区表添加新的分区有 2 种情况:
(1) 原分区里边界是 maxvalue 或者 default。 这种情况下,我们需要把边界分区 drop 掉,加上新分区后,再添加上新的分区。 或者采用 split,对边界分区进行拆分
(2) 没有边界分区的。 这种情况下,直接添加分区就可以了。

创建分区表:

  1.  
    CREATE TABLE WJZ.wjz_t1
  2.  
    ( ID NUMBER,
  3.  
    STR1 VARCHAR2(20),
  4.  
    STR2 VARCHAR2(20),
  5.  
    STR3 VARCHAR2(20),
  6.  
    tdate date,
  7.  
    constraint pk_id_t1 primary key(id)
  8.  
    )
  9.  
    PARTITION BY RANGE (TDATE)
  10.  
    (PARTITION P202212 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')),
  11.  
    PARTITION POTHER VALUES LESS THAN (MAXVALUE) )

然后插入数据

  1.  
    insert into WJZ_T1 values(1,'str1','str2','abc',to_date('2022-11-10 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  2.  
    insert into WJZ_T1 values(2,'str1','str2','abc',to_date('2022-12-10 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  3.  
    insert into WJZ_T1 values(3,'str1','str2','abc',to_date('2023-1-10 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  4.  
    insert into WJZ_T1 values(4,'str1','str2','abc',to_date('2023-1-12 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  5.  
    insert into WJZ_T1 values(5,'str1','str2','abc',to_date('2023-2-10 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  6.  
    insert into WJZ_T1 values(6,'str1','str2','abc',to_date('2023-2-14 00:00:01','yyyy-mm-dd hh24:mi:ss'));
  7.  
    insert into WJZ_T1 values(7,'str1','str2','abc',to_date('2023-3-10 00:00:01','yyyy-mm-dd hh24:mi:ss'));

其中增加POHTER分区是为了防止不符合分区条件是数据插入报错,但是如果直接新增分区会报错ORA-14074: 分区界限必须调整为高于最后一个分区界限,根本原因是存在最后maxvalue分区

ALTER TABLE wjz_t1 ADD PARTITION P202301 VALUES LESS THAN(TO_DATE('2023-02-01','YYYY-MM-DD'));

学新通

 解决方法是拆分分区,在split partition时,根据split point原来的partition分裂成两个partition。

同时,观察在拆分分区前查看索引情况: 

select a.index_name,a.status from user_indexes a where table_name in ('WJZ_T1') ;

学新通

拆分分区SQL:

  1.  
    ALTER TABLE wjz_t1 SPLIT PARTITION POTHER AT (TO_DATE('2023-02-01','YYYY-MM-DD')) INTO (PARTITION P202301, PARTITION POTHER);
  2.  
    ALTER TABLE wjz_t1 SPLIT PARTITION POTHER AT (TO_DATE('2023-04-01','YYYY-MM-DD')) INTO (PARTITION P202303, PARTITION POTHER);

 新增表分区成功,如下

 学新通

查看表索引也是正常的:

 学新通

 但是如果要新增P202302表分区的话,以下会报错:

ALTER TABLE wjz_t1 SPLIT PARTITION POTHER AT (TO_DATE('2023-03-01','YYYY-MM-DD')) INTO (PARTITION P202302, PARTITION POTHER);

 所以分区拆分的时候,必须从小的开始,否则会提示如下报错

ORA-14080:无法按指定的上限来分割分区

正确的是

ALTER TABLE wjz_t1 SPLIT PARTITION P202303 AT (TO_DATE('2023-03-01','YYYY-MM-DD')) INTO (PARTITION P202302, PARTITION P202303);

学新通  

此时查看表索引有问题:

学新通

 需要重建索引:

ALTER INDEX PK_ID_T1 REBUILD ONLINE;

或者在拆分分区的时候使用以下也会重建索引:

ALTER TABLE wjz_t1 SPLIT PARTITION P202303 AT (TO_DATE('2023-03-01','YYYY-MM-DD')) INTO (PARTITION P202302, PARTITION P202303) UPDATE INDEXES ;

所以如果清理表时,如果时间分区忘了增加,可以拆分默认表分区来新增表分区,然后再通过删除分区方式来清理数据:

alter table WJZ_T1 drop partition P202302;

 但需要注意的是观察分区表的索引情况。

如果表分区split的时候将tablespace更换了,那么也需要rebuild index .

参考文章:

oracle11.2中add&split partition 对全局及本地index的影响 - 知乎

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibaggg
系列文章
更多 icon
同类精品
更多 icon
继续加载