去重80W重複資料時夯死臨時處理,80w

來源:互聯網
上載者:User

去重80W重複資料時夯死臨時處理,80w

原創作品,出自 “深藍的blog” 部落格,歡迎轉載,轉載時請務必註明出處,否則追究著作權法律責任。

深藍的blog:http://blog.csdn.net/huangyanlong/article/details/46041735

 

去重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.PROCESSORDER 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萬資料的目的。但為何直接處理出現夯死情況,有待後續跟蹤分析。

 

原創作品,出自 “深藍的blog” 部落格,歡迎轉載,轉載時請務必註明出處,否則追究著作權法律責任。

深藍的blog:http://blog.csdn.net/huangyanlong/article/details/46041735

 

系列連結_20150523:

藍的成長記——追逐DBA(1):奔波於路上,挺進山東 

藍的成長記——追逐DBA(2):安裝!安裝!久違的記憶,引起我對DBA的重新認知

藍的成長記——追逐DBA(3):古董上操作,資料匯入匯出成了問題 

藍的成長記——追逐DBA(4):追憶少年情愁,再探oracle安裝(Linux下10g、11g) 

藍的成長記——追逐DBA(5):不談技術談業務,惱人的應用系統

藍的成長記——追逐DBA(6): 做事與做人:小技術,大為人

藍的成長記——追逐DBA(7):基礎命令,地基之石 

藍的成長記——追逐DBA(8):重拾SP報告,回憶oracle的STATSPACK實驗

藍的成長記— —追逐DBA(9):國慶漸去,追逐DBA,新規劃,新啟程

藍的成長記——追逐DBA(10):飛刀防身,熟絡而非專長:擺弄中介軟體Websphere 

藍的成長記——追逐DBA(11):回家後的安逸,暈暈乎乎醒了過來 

藍的成長記——追逐DBA(12):七天七收穫的SQL

藍的成長記——追逐DBA(13):協調硬體廠商,六個故事:所見所感的“伺服器、儲存、交換器......”

藍的成長記——追逐DBA(14):難忘的“雲”端,起步的hadoop部署 

藍的成長記——追逐DBA(15):以為FTP很“簡單”,誰成想一波三折

藍的成長記——追逐DBA(16):DBA也喝酒,被捭闔了

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.