社区编辑申请
注册/登录
一次去重 80w 数据时夯死临时处理实例
数据库 Oracle
近日,博主在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。下面就让我们跟随博主来简单回忆一下。

近日,在对一张百万数据的业务表进行去重时,去重操作竟然夯住了。下面就来简单回忆一下。

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、于是,在晚上下班前,执行了下面的语句脚本,为了去重

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> commit;

4、第二天,到达现场时,发现PL/SQL Developer工具中昨天晚上执行的语句仍在执行中

首先察觉,80多w的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题?

怀疑有锁表。

于是查询是否有锁表的用户。

 

  1. SELECT 
  2.   A.OWNER,                        --OBJECT所属用户 
  3.   A.OBJECT_NAME,                  --OBJECT名称 
  4.   B.XIDUSN, 
  5.   B.XIDSLOT, 
  6.   B.XIDSQN, 
  7.   B.SESSION_ID,                   --锁表用户的session 
  8.   B.ORACLE_USERNAME,              --锁表用户的Oracle用户名 
  9.   B.OS_USER_NAME,                 --锁表用户的操作系统登陆用户名 
  10.   B.PROCESS, 
  11.   B.LOCKED_MODE,  
  12.   C.MACHINE,                      --锁表用户的计算机名称 
  13.   C.STATUS,                       --锁表状态 
  14.   C.SERVER, 
  15.   C.SID, 
  16.   C.SERIAL#, 
  17.   C.PROGRAM                       --锁表用户所用的数据库管理工具 
  18. FROM 
  19.   ALL_OBJECTS A, 
  20.   V$LOCKED_OBJECT B, 
  21.   SYS.GV_$SESSION C  
  22. WHERE 
  23.   A.OBJECT_ID = B.OBJECT_ID 
  24.   AND B.PROCESS = C.PROCESS 
  25. 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、采用分批次,解决去重夯住问题

由于直接去重无法顺利进行,于是想到了分批次去重的方法,试一下。

 

  1. ***次: 
  2. 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; 
  3. commit
  4.  
  5. 第二次: 
  6. 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; 
  7. commit
  8.  
  9. 。。。。。。。 
  10. 。。。。。。。 
  11. 。。。。。。。 
  12.  
  13. 第八次: 
  14. 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); 
  15. commit

 

结果:通过将80多万数据划分成以10w数据为单次进行去重操作,总共用时140多秒,完成了去重80万数据的目的。但为何直接处理出现夯死情况,有待后续跟踪分析。

博文出处:http://blog.csdn.net/huangyanlong/article/details/46041735
 

责任编辑:Ophira 来源: 个人博客
相关推荐

2022-05-18 23:42:08

网络安全安全分析工具

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-05-20 14:54:33

数据安全数字化转型企业

2022-05-17 14:03:42

勒索软件远程工作

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-05-17 15:51:32

数据中心运维能力基础设施

2022-05-26 11:37:58

亚马逊云科技C7g实例

2022-05-16 10:49:28

网络协议数据

2022-05-12 13:44:35

2022-05-10 14:11:05

网络安全网络犯罪

2022-05-11 14:05:11

区块链网络安全存储

2022-05-25 16:52:55

数据智能瑞数信息API

2022-05-19 19:26:33

区块链大数据数据分析

2022-05-25 10:49:02

云存储云计算

2022-04-29 13:15:13

数据中台管控

2022-05-24 09:57:32

微软开源AI 驱动

2022-05-03 23:21:13

安全意识网络安全网络钓鱼

2022-04-25 14:06:28

数据分析人工智能机器学习

2022-05-24 14:26:11

云原生数据库云架构

2022-05-24 21:29:30

编辑推荐

Oracle免费的便捷Web应用开发框架二则Oracle数据库初学者开场篇ORACLE数据库异步IO介绍一次去重 80w 数据时夯死临时处理实例如何只授予用户查看存储过程定义的权限
我收藏的内容
点赞
收藏

51CTO技术栈公众号