实例讲解临时处理去重 80w 数据时夯死现象
近日,在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。下面就来简单回忆一下。
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(*)
830099
3、于是,在晚上下班前,执行了下面的语句脚本,为了去重
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(*)
SQL commit;
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
在下面结果中可以看到,锁表的只是去重语句的发起会话,并没有其它用户造成锁表,这说明语句仍然在执行嘛 带着疑问,开始尝试解决。
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;
commit;
第二次:
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;
commit;
。。。。。。。
。。。。。。。
。。。。。。。
第八次:
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(*)
commit;
结果:通过将80多万数据划分成以10w数据为单次进行去重操作,总共用时140多秒,完成了去重80万数据的目的。但为何直接处理出现夯死情况,有待后续跟踪分析。
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 实例讲解临时处理去重 80w 数据时夯死现象
相关文章
- 开源交流丨任务or实例 详解大数据DAG调度系统Taier任务调度
- 1DCNN实例,代码和结果
- 如何利用python读excel数据_python在excel应用实例
- 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据
- 数据分享|PYTHON用决策树分类预测糖尿病和可视化实例|附代码数据
- 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
- 【ES三周年】线下es环境数据迁移至腾讯云ES实例实践
- SQL开发知识:Mysql生成数据字典的原理与实例
- MapReduce实例(数据去重)详解大数据
- 快速实现Oracle实例建立的全流程指南(建立oracle实例)
- Redis创建新实例:高速、轻巧的内存数据存储平台(rediscreate)
- Oracle SQL语法详解及实例演示(oracle语法)
- Redis设计技巧实例解析(redis设计实例)
- 在PHP中操作Excel实例代码
- aspx不显示ViewState的实例
- js实现的切换面板实例代码
- Ajax异步提交表单数据的说明及方法实例
- js实时获取系统当前时间实例代码
- java单向链表的实现实例
- c#远程html数据抓取实例分享
- Hadoop1.2中配置伪分布式的实例
- ThinkPHP写数组插入与获取最新插入数据ID实例
- Dwz与thinkphp整合下的数据导出到Excel实例
- javascript数组与php数组的地址传递及值传递用法实例