一次sqlldr匯入慢的解決過程
今天在客戶處進行培訓時,客戶抱怨到,sqlldr的速度太慢,說是從昨天晚上載入資料到今天上午,都沒有結束。載入的文字檔案大小為10M,大概包含10萬條記錄。按照我的理解,sqlldr幾乎不可能花這麼長的時間的。
於是,讓客戶查詢v$session_wait,發現執行sqlldr載入的session(session id為33)正在等待library cache lock的等待事件。很明顯,sqlldr一直在等待,而不是在進行實際的載入工作。
既然是等待library cache lock,說明有其他的程式鎖定了要載入的表,導致sqlldr
無法獲得該表上的lock。這屬於shared pool裡的一種爭用。
然後,我讓客戶發出下面的SQL:
select /*+ ordered */
w1.sid waiting_session,
h1.sid holding_session,
w.kgllktype lock_or_pin,
w.kgllkhdl address,
decode(h.kgllkmod,0,'None',1,'Null',2,'Share',3,'Exclusive','Unknown') mode_held,
decode(w.kgllkreq,0,'None',1,'Null',2,'Share',3,'Exclusive','Unknown') mode_requested
from dba_kgllock w, dba_kgllock h, v$session w1, v$session h1
where (((h.kgllkmod != 0) and (h.kgllkmod != 1)
and ((h.kgllkreq = 0) or (h.kgllkreq = 1)))
and (((w.kgllkmod = 0) or (w.kgllkmod = 1))
and ((w.kgllkreq != 0) and (w.kgllkreq != 1))))
and w.kgllktype = h.kgllktype
and w.kgllkhdl = h.kgllkhdl
and w.kgllkuse = w1.saddr
and h.kgllkuse = h1.saddr;
該sql可以很清楚的顯示出,誰阻礙了誰。查詢結果顯示23號session鎖定了33號session。於是發出下面的sql:
select sql_text from v$sql
where hash_value=(select sql_hash_value from v$session where sid=23);
可以看到23號session在幹什麼。結果發現它在執行重新rebuild索引的命令:
alter index XXX rebuild online;
而該索引正是要載入的表上的索引,於是可以肯定,該語句阻塞了sqlldr的操作。
於是在確定了23號session無關緊要以後,將該session直接切斷即可。切斷該session以後,sqlldr很快就完成了載入資料的工作。
結論:
當發現oracle裡某個動作特別慢的時候,先檢視一下它在等待什麼。
可能並不一定是這個動作本身慢,而是其他的原因導致它無法進行下去。
於是,讓客戶查詢v$session_wait,發現執行sqlldr載入的session(session id為33)正在等待library cache lock的等待事件。很明顯,sqlldr一直在等待,而不是在進行實際的載入工作。
既然是等待library cache lock,說明有其他的程式鎖定了要載入的表,導致sqlldr
無法獲得該表上的lock。這屬於shared pool裡的一種爭用。
然後,我讓客戶發出下面的SQL:
select /*+ ordered */
w1.sid waiting_session,
h1.sid holding_session,
w.kgllktype lock_or_pin,
w.kgllkhdl address,
decode(h.kgllkmod,0,'None',1,'Null',2,'Share',3,'Exclusive','Unknown') mode_held,
decode(w.kgllkreq,0,'None',1,'Null',2,'Share',3,'Exclusive','Unknown') mode_requested
from dba_kgllock w, dba_kgllock h, v$session w1, v$session h1
where (((h.kgllkmod != 0) and (h.kgllkmod != 1)
and ((h.kgllkreq = 0) or (h.kgllkreq = 1)))
and (((w.kgllkmod = 0) or (w.kgllkmod = 1))
and ((w.kgllkreq != 0) and (w.kgllkreq != 1))))
and w.kgllktype = h.kgllktype
and w.kgllkhdl = h.kgllkhdl
and w.kgllkuse = w1.saddr
and h.kgllkuse = h1.saddr;
該sql可以很清楚的顯示出,誰阻礙了誰。查詢結果顯示23號session鎖定了33號session。於是發出下面的sql:
select sql_text from v$sql
where hash_value=(select sql_hash_value from v$session where sid=23);
可以看到23號session在幹什麼。結果發現它在執行重新rebuild索引的命令:
alter index XXX rebuild online;
而該索引正是要載入的表上的索引,於是可以肯定,該語句阻塞了sqlldr的操作。
於是在確定了23號session無關緊要以後,將該session直接切斷即可。切斷該session以後,sqlldr很快就完成了載入資料的工作。
結論:
當發現oracle裡某個動作特別慢的時候,先檢視一下它在等待什麼。
可能並不一定是這個動作本身慢,而是其他的原因導致它無法進行下去。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9842/viewspace-331084/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 排查Mysql突然變慢的一次過程MySql
- 記一次 Composer 問題的解決過程!!
- 一次資料庫匯入解決方案資料庫
- platformIO安裝過程中速度慢、卡住的解決方法Platform
- 一次線上問題的排查解決過程
- 解Bug之路-記一次中介軟體導致的慢SQL排查過程SQL
- 記一次expdp匯出任務中某張大表報錯問題的解決過程
- 【原創】記錄一次Tomcat總是載入舊專案的解決過程Tomcat
- 記錄一次排查解決伺服器卡死的過程伺服器
- 記一次開啟資料庫慢原因分析過程資料庫
- 一次難忘的協助解決Oracle RAC恢復過程Oracle
- 記一次bug解決過程(數字轉化成中文)
- 記一次透過Memory Analyzer分析記憶體洩漏的解決過程記憶體
- WordPress程式載入慢解決教程
- 詳細記錄一次npm i canvas報錯的解決過程NPMCanvas
- 一次JVM_OLD區佔用過高、頻繁Full GC的解決過程JVMGC
- 記一次 PHP-FPM 可以建立慢日誌,但是卻不能寫入內容的折騰過程PHP
- 記一次asp.net 8 伺服器爆滿的解決過程ASP.NET伺服器
- Docker官方映象加速解決pull過慢的問題Docker
- 解決Rust -- update crates.io過慢的問題Rust
- Oracle 12.1.0.2 impdp匯入慢診斷Oracle
- 三-類的載入過程詳解
- 解決建立SpringBoot工程載入較慢的問題Spring Boot
- mysql 匯入匯出資料庫以及函式、儲存過程的介紹MySql資料庫函式儲存過程
- 記一次 500併發,平均響應時間慢-調優過程~~
- Redis資料匯入工具優化過程總結Redis優化
- 記一次記憶體溢位問題的排查、分析過程及解決思路記憶體溢位
- 記一次SQLServer2019安裝和解除安裝問題的解決過程SQLServer
- 記一次JVM FullGC引發嚴重線上事故的定位、分析、解決過程!JVMGC
- 一個 ExpressionChangedAfterItHasBeenCheckedError 錯誤的解決過程ExpressError
- sbt下載相關依賴過慢的解決辦法
- 關於vue路由懶載入連結過多時,本地開發熱更新過慢的解決辦法Vue路由
- Excel匯入null錯誤解決方式ExcelNull
- mysql匯入報錯怎麼解決?MySql
- 解Bug之路-記一次儲存故障的排查過程
- 資料庫匯入匯出時報ORA-01843的解決方法資料庫
- 利用 Arthas 解決啟動 StandbyNameNode 載入 EditLog 慢的問題
- 電腦開機慢怎麼解決 電腦開機慢的解決方法