oracle

推荐列表 站点导航

当前位置:首页 > 数据库 > oracle >

实例讲解临时处理去重 80w 数据时夯死现象

来源:互联网  作者:网络  发布时间:2020-12-07 09:18
这篇文章主要介绍了临时处理去重 80w 数据时夯死现象,需要的朋友可以参考下 近日,在对一张百万数据的业务表进...

这篇文章主要介绍了临时处理去重 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(*)>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的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题?

怀疑有锁表。

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

 

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(*)>1);  

commit; 

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

以上就是临时处理去重80w数据时夯死现象的全部过程,希望可以帮到大家。

相关热词: 实例

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://www.juheyunku.com/sql/oracle/974.shtml

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

实例讲解临时处理去重 80w 数据时夯死现象

2020-12-07 编辑:网络

这篇文章主要介绍了临时处理去重 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(*)>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的去重数据跑了一个晚上也没跑完?这肯定是哪里出了问题?

怀疑有锁表。

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

 

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(*)>1);  

commit; 

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

以上就是临时处理去重80w数据时夯死现象的全部过程,希望可以帮到大家。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://www.juheyunku.com/sql/oracle/974.shtml

相关文章

风云图片

推荐阅读

返回oracle频道首页