实例讲解临时处理去重 80w 数据时夯死现象
近日,在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。下面就来简单回忆一下。 1、查询业务表数据量,查看到总共有200多w条 select count(*) from tb_bj_banker_etl;2552381 2、查询表内应该去掉的重复数据量,共80多w条 select count(*) from tb_bj_banker_etl where (id) in (select id from tb_bj_banker_etl group by id having count(*)>1) and rowid not in(select max(rowid) from tb_bj_banker_etl group by id having count(*)>1);830099 3、于是,在晚上下班前,执行了下面的语句脚本,为了去重 delete from tb_bj_banker_etl where(id) in (select id from tb_bj_banker_etl group by id having count(*)>1) and rowid not in(select max(rowid) from tb_bj_banker_etl group by id having count(*)>1);SQL> commit; 4、第二天,到达现场时,发现PL/SQL Developer工具中昨天晚上执行的语句仍在执行中 首先察觉,80多w的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题? 怀疑有锁表。 于是查询是否有锁表的用户。 在下面结果中可以看到,锁表的只是去重语句的发起会话,并没有其它用户造成锁表,这说明语句仍然在执行嘛?带着疑问,开始尝试解决。 1 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB ACTIVE DEDICATED 913 3381 plsqldev.exe 2 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 649 41791 plsqldev.exe 3 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 817 27777 plsqldev.exe 4 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUPBACKDB INACTIVE DEDICATED 841 1981 plsqldev.exe 5、采用分批次,解决去重夯住问题 由于直接去重无法顺利进行,于是想到了分批次去重的方法,试一下。 1) and rowid not in(select max(rowid) from tb_bj_banker_etl group by id having count(*)>1) and rownum<=100000; commit;第二次: 。。。。。。。 第八次: 结果:通过将80多万数据划分成以10w数据为单次进行去重操作,总共用时140多秒,完成了去重80万数据的目的。但为何直接处理出现夯死情况,有待后续跟踪分析。 以上就是临时处理去重80w数据时夯死现象的全部过程,希望可以帮到大家。 (编辑:鲜蔬坊站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Oracle 高速批量数据加载工具sql*loader使用说明
- oracle监控某表变动触发器例子(监控增,删,改)
- Kettle 连接 Oracle 问题总结
- Oracle 数据库自动存储管理-安装配置
- Oracle查询中OVER (PARTITION BY ..)用法
- Oracle性能优化之性能调整_超越OCP精通Oracle视频教程培训3
- Windows下编写批处理脚本来启动和重置Oracle数据库
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批
- rman blockrecover ORA-600 [kcrrge.cannotread_inc.1] ora
- ORACLE 给用户授权truncate table 的实现方案