oracle巨大表的数据删除的方法,20分钟搞定
2010-01-01 20:42
190 查看
oracle巨大表的数据删除的方法,20分钟搞定 |
一个客户的日志表,已经有3000多千万的记录了,容量大约30G,打算维护一下,看了一下字段,发现日志是按日期记录的,打算只保留3个月的日志就好了。 第一个思路: 按条件查出来,直接DELETE 试了一下 delete from NTLS_LOGS where to_char(START_TIMES,'yyyy-mm-dd hh:mi:ss') <'2008-08-01 00:00:00'; 时间会非常长,不知道多少天能跑完,反正一个晚上没跑完,UNDO会增长到一个可怕的数字 这个思路是不行的 研究了一下,发现大多数人的思路是做个循环,每5000条左右提交一次,做了个测试语句试了一下,每小时能删除80-90万条,晕倒需要删除的数据是2700万条,猴年马月才能完成。 询问客户,发现这个业务日志表不是什么时候都要写的,每天晚上10点到第二天早上6点是没有人会使用的,很好,我立刻考虑了一种方法,思路是将需要的数据提取出来到一个新的表,然后将原表删除,将这个提取出来的表重命名为旧的日志表名。 呵呵,试一下这种方法的威力,生成新的数据整个过程只用了172S,也就是3分钟左右,表是生成了,但是没有索引,那就照抄原表的索引吧,呵呵最后花了18分21秒搞定了,其实原理就是只处理必须保留的数据这些数据远远小于要删掉的数据,跳过不需要的数据,采用CREAT SELECT AS可以充分使用索引,而且不会生存UNDO,因此速度大大加快,该方法的弊端是,必须要有一点时间,没有人使用这个表才行。 于是我写了一个SQL,将这个放到每月的自动执行计划里定期执行,定期维护这个表,避免表异常膨大,说了原理,就该上SQL了。 drop table new_log_temp; create table new_log_temp as select * from NTLS_log where timestamp > to_date(to_char(SYSDATE-90,'yyyy-mm-dd'),'yyyy-mm-dd'); drop NTLS_LOG; alter table new_log_temp rename to NTLS_LOG; create index IDX_NTLS_LOG on NTLS_LOG (RECORD) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create index IDX_NTLS_LOG_OPERATE_ID on NTLS_LOG (OPERATE) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create index IDX_NTLS_LOG_START_SCN on NTLS_LOG (START_SCN) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create index IDX_T_LOG_START_TIMESTAMP on NTLS_LOG (TIMESTAMP) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create index INDEX_NTLS_LOG_UID on NTLS_LOG (UID) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); create unique index PK_NTLS_LOG on NTLS_LOG (OPERATE,UID, TABLE_NAME, TABLE_OWNER, ROW_ID) tablespace INDEXES pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); 最后来一句总结吧,条条大路通北京,不一定非要走路,飞机不更好。 |
相关文章推荐
- oracle误删除表数据的恢复方法
- Oracle删除重复记录只保留一条数据的几种方法
- Oracle查询重复数据与删除重复记录方法
- oracle误删除表数据恢复方法
- Oracle中删除一列数据的方法
- oracle数据中删除数据时提示“记录被另一个用户锁住” 解决方法: 1、查看数据库锁,诊断锁的来源及类型: select object_id
- Oracle删除重复记录只保留一条数据的几种方法
- Oracle:高效删除Oracle中重复数据的方法
- oracle删除重复数据三种方法
- Oracle查询重复数据与删除重复记录方法
- ORACLE恢复删除数据的方法之flashback
- Oracle 按照Rownum删除数据的一种方法
- oracle误删除数据的恢复方法
- Oracle 删除数据的几种方法
- Oracle 删除数据的几种方法
- Oracle因删除库数据文件导致服务无法启动的处理方法
- 误使用rm删除数据文件导致oracle无法启动的修复方法
- oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 转
- oracle 删除表空间(tablespace)及数据文件的方法
- oracle 删除大量数据的方法