ORACLE一次大量数据删除导致问题的处理
由于项目运行时间较久,导致ORACLE表中记录数太多,对这个表(以下称table1)的操作也比较多,包括查询更新,最后导致对table1的操作消耗cpu猛增,最后网站不能访问。 由于知道是这个问题,所以就打算将历史数据备份,仅留最近一个月的数据在table1中。 1、方案1:根据某个与时间相关的字段,一年一年的删除delete from table1 where data_id like '_2015'; data_id 是包含时间字段的产品id。 问题:由于table1的表数据量大,仅仅查询其中一条记录都耗时几分钟,所以一年一年删除的速度特别慢,让人以为出错的感觉。删除2015年数据耗时一个小时都没有删除掉。适用于对这个表的操作还不算太慢的情况下。
2、方案2:步骤如下: 采用链接中的步骤 1) 备份所有数据到另外一张表baktable1
可以将方案2 优化如下:
1) 备份所有数据到另外一张表baktable1 create table baktable1 as select * from table1; 2) 备份最近一个月的数据到一张临时表temptable1中 create table temptable1 as select * from table1 where input_date > to_date("2017-05-01","yyyy-MM-dd"); 3)删除表table1中的数据 truncate table table1 ; 4) 把最近一个月的数据插入到table1 这里和方案2 不一样 insert into table1 (select * fromtemptable1); 5) 删除临时表 droptable temptable1;
如果已经采用了方案21、插入主键、索引 2、设置默认值 alter table table1 modify tag default 'S';alter table table1 modify input_date default sysdate; 查看表的默认值设置: select t.nullable as 是否为空, t.data_default as 默认值 from USER_TAB_COLS t where TABLE_NAME ='NMC_DATA';
参考:http://www.cnblogs.com/songling/archive/2013/08/24/3279588.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |