oracle大表删除数据方案

需求简介:生产数据库一个表有27亿多数据,要删除其中其中2014年之前的历史数据(大约4亿左右),表信息:5个字段的主键、一个字段的单列索引、hash分区。

数据库情况:每日1:00-9:00会跑增量数据程序,其他sql不能影响增量程序。(所以数据要在9:00-24:00之内跑完)

解决方案1:

delete /*+parallel(32)*/ from table_name where date<to_date('2014-01-01','yyyy-mm-dd');

  结果:删除了8个小时,才删除几千万,怕影响第二天增量程序,直接杀进程,进程杀完数据回滚了20多小时,第二天增量最终还是影响了。

解决方案2(采用的):

--1,建分区表(如果不是分区表可以create...select)

--2,插入数据
insert /*+parallel(32)*/ into table_name_new
select /*+parallel(32)*/* from  table_name where date>=to_date('2014-01-01','yyyy-mm-dd');

--3,创建索引
create index index_name1 on table_neme_new(column1) parallel 32;

--4,索引并发创建要关闭并行,这样在我们使用索引时会影响执行计划,也会消耗很多的资源。所以,我们需要对这个并行度进行修改,改成noparallel
alter index index_name1 noparallel;

--5,创建主键,由于创建主键不能开启并行,所以要先创建主键字段唯一索引,再创建主键
create unique index pk_name1 on table_neme_new(column1,column2,...) parallel 32;
alter index pk_name1  noparallel;
alter table table_neme_new add constraint pk_name1 primary key(column1,column2,...);

--6,核对数据量没问题,将老表rename其他名字,将新表rename老名字

  结果:插入数据3.5小时,建单列索引40分钟,建主键40分钟。达到可以接受范围。

原文地址:https://www.cnblogs.com/dongchao3312/p/12777782.html