实例讲解临时处理去重 80w 数据时夯死现象
近日,在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。狼蚁网站SEO优化就来简单回忆一下。
1、查询业务表数据量,查看到总共有200多w条
SQL> select count() from tb_bj_banker_etl; 2552381
2、查询表内应该去掉的重复数据量,共80多w条
SQL> 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、于是,在晚上下班前,执行了狼蚁网站SEO优化的语句脚本,为了去重
SQL> 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> mit;
4、第二天,到达现场时,发现PL/SQL Developer工具中昨天晚上执行的语句仍在执行中
察觉,80多w的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题?
怀疑有锁表。
于是查询是否有锁表的用户。
SELECT A.OWNER, --OBJECT所属用户 A.OBJECT_NAME, --OBJECT名称 B.XIDUSN, B.XIDSLOT, B.XIDSQN, B.SESSION_ID, --锁表用户的session B.ORACLE_USERNAME, --锁表用户的Oracle用户名 B.OS_USER_NAME, --锁表用户的操作系统登陆用户名 B.PROCESS, B.LOCKED_MODE, C.MACHINE, --锁表用户的计算机名称 C.STATUS, --锁表状态 C.SERVER, C.SID, C.SERIAL#, C.PROGRAM --锁表用户所用的数据库管理工具 FROM ALL_OBJECTS A, V$LOCKED_OBJECT B, SYS.GV_$SESSION C WHERE A.OBJECT_ID = B.OBJECT_ID AND B.PROCESS = C.PROCESS ORDER BY 1,2
在狼蚁网站SEO优化结果中可以看到,锁表的只是去重语句的发起会话,并没有其它用户造成锁表,这说明语句仍然在执行嘛?带着疑问,开始尝试解决。
1 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUP\BACKDB ACTIVE DEDICATED 913 3381 plsqldev.exe
2 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUP\BACKDB INACTIVE DEDICATED 649 41791 plsqldev.exe
3 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUP\BACKDB INACTIVE DEDICATED 817 27777 plsqldev.exe
4 BJHYL tb_bj_banker_ETL 15 18 9000 913 BJHYL Administrator 4036:972 3 WORKGROUP\BACKDB INACTIVE DEDICATED 841 1981 plsqldev.exe
5、采用分批次,解决去重夯住问题
由于直接去重无法顺利进行,于是想到了分批次去重的方法,试一下。
第一次 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) and rownum<=100000; mit; 第二次 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) and rownum<=100000; mit; 。。。。。。。 。。。。。。。 。。。。。。。 第八次 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); mit;
结果通过将80多万数据划分成以10w数据为单次进行去重操作,总共用时140多秒,完成了去重80万数据的目的。但为何直接处理出现夯死情况,有待后续跟踪分析。
以上就是临时处理去重80w数据时夯死现象的全部过程,希望可以帮到大家。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程