實(shí)例講解臨時(shí)處理去重 80w 數(shù)據(jù)時(shí)夯死現(xiàn)象
近日,在對(duì)一張百萬數(shù)據(jù)的業(yè)務(wù)表進(jìn)行去重時(shí),去重操作竟然夯住了。下面就來簡(jiǎn)單回憶一下。
1、查詢業(yè)務(wù)表數(shù)據(jù)量,查看到總共有200多w條
SQL> select count(*) from tb_bj_banker_etl; 2552381
2、查詢表內(nèi)應(yīng)該去掉的重復(fù)數(shù)據(jù)量,共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、于是,在晚上下班前,執(zhí)行了下面的語句腳本,為了去重
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、第二天,到達(dá)現(xiàn)場(chǎng)時(shí),發(fā)現(xiàn)PL/SQL Developer工具中昨天晚上執(zhí)行的語句仍在執(zhí)行中
首先察覺,80多w的去重?cái)?shù)據(jù)跑了一個(gè)晚上也沒跑完?這肯定是哪里出了問題?
懷疑有鎖表。
于是查詢是否有鎖表的用戶。
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, --鎖表用戶的操作系統(tǒng)登陸用戶名 B.PROCESS, B.LOCKED_MODE, C.MACHINE, --鎖表用戶的計(jì)算機(jī)名稱 C.STATUS, --鎖表狀態(tài) C.SERVER, C.SID, C.SERIAL#, C.PROGRAM --鎖表用戶所用的數(shù)據(jù)庫管理工具 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
在下面結(jié)果中可以看到,鎖表的只是去重語句的發(fā)起會(huì)話,并沒有其它用戶造成鎖表,這說明語句仍然在執(zhí)行嘛?帶著疑問,開始嘗試解決。
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、采用分批次,解決去重夯住問題
由于直接去重?zé)o法順利進(jìn)行,于是想到了分批次去重的方法,試一下。
第一次: 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;
結(jié)果:通過將80多萬數(shù)據(jù)劃分成以10w數(shù)據(jù)為單次進(jìn)行去重操作,總共用時(shí)140多秒,完成了去重80萬數(shù)據(jù)的目的。但為何直接處理出現(xiàn)夯死情況,有待后續(xù)跟蹤分析。
以上就是臨時(shí)處理去重80w數(shù)據(jù)時(shí)夯死現(xiàn)象的全部過程,希望可以幫到大家。
相關(guān)文章
對(duì)學(xué)Oracle數(shù)據(jù)庫初學(xué)者的開場(chǎng)篇
這篇文章主要介紹了對(duì)學(xué)Oracle數(shù)據(jù)庫初學(xué)者的開場(chǎng)篇,方便想學(xué)習(xí)oracle數(shù)據(jù)庫的朋友2015-05-05
Maven中央倉庫正式成為Oracle官方JDBC驅(qū)動(dòng)程序組件分發(fā)中心(推薦)
這篇文章主要介紹了Maven中央倉庫正式成為Oracle官方JDBC驅(qū)動(dòng)程序組件分發(fā)中心,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Oracle中serveroutput參數(shù)一次設(shè)置永久保存方法
serveroutput是sqlplus的配置參數(shù),而不是數(shù)據(jù)庫的配置參數(shù),每次都需要修改并保存sqlplus的配置參數(shù),本文將介紹如何一次設(shè)置永久保存2012-11-11
Oracle9i 動(dòng)態(tài)SGA,PGA特性探索
雖然Oracle9i中的內(nèi)存管理仍然需要很多的手工操作,不過大部分的Oracle管理員可以使用工具來連續(xù)地監(jiān)控Oracle SGA中的內(nèi)存使用,并且可以根據(jù)Oracle instance中現(xiàn)在的使用情況來自動(dòng)地重新分配內(nèi)存。2009-03-03
oracle中存儲(chǔ)函數(shù)與存儲(chǔ)過程的區(qū)別介紹
這篇文章主要介紹了oracle中存儲(chǔ)函數(shù)與存儲(chǔ)過程的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-10-10
Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法
這篇文章主要介紹了Oracle DATABASE LINK(DBLINK)創(chuàng)建與刪除方法,需要的朋友可以參考下2016-02-02
Oracle動(dòng)態(tài)視圖v$active_session_history實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了Oracle動(dòng)態(tài)視圖v$active_session_history實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

