Oracle效能問題診斷一例

regonly1發表於2012-09-11
       今天一開啟資料庫,我還什麼事情都沒做,就發現硬碟燈狂轉。這是為啥?
初步判定是Oracle的計劃任務在執行,但是哪個在執行,還不知道。
       所以,第一步先判斷後臺在跑什麼東西:
select * from v$session_longops where sofar <> totalwork
       從這個可以瞭解到大部分資訊,包括:
1、session資訊:sid,serial#
2、執行內容:target_desc
3、執行進度:sofar/totalwork
4、開始時間:start_time
5、執行使用者:username
6、sql資訊:sql_id,sql_address,sql_hash_value
       根據以上內容,其實我就已經可以強制停止這個的sql了,但是還得找出這個源頭,也就是“責任人”--誰執行了這個sql。
       於是,第二個步驟就是根據上面的第五點:執行使用者,去找該使用者下對應的計劃任務或job:
1、job:
select * from user_jobs
2、計劃任務:
select * from user_scheduler_jobs;
       從這裡我知道了發起人及具體發起的那個執行點。
       接下來的事情就簡單了,先確認下這個定時處理的是什麼內容,如果沒有用或對當前環境無關緊要,則關閉job或計劃任務:
exec dbms_job.broken(21,true);
exec dbms_scheduler.disable('AUTO_SPACE_ADVISOR_JOB');--這是例子
       當然,有時候不是直接關閉就行了,還得看下為何會產生這麼大的磁碟掃描。這個時候就要去看sql的執行計劃,搞清原因,然後對其最佳化。這次我本地產生這個問題的原因其實很簡單,因為匯入dmp的時候沒有指定索引,索引後臺處理的時候都是走的全表掃描,導致出現這個情況。
       最後,關閉之後,還有做一件事情,就是把正在執行的過程停止掉:
alter system kill session 'sid,serial#'
 
 
      

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12932950/viewspace-743114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章