深入淺出等待事件和效能診斷01

dotaddjj發表於2012-01-06

最近都在培訓舞蹈,oracleos上很久沒有去看了,年底也快忙完了電還是要衝的,還是迴歸oracle世界吧!終於算是初步把eygle的深入淺出全部讀完了,就深入淺出的最後兩章等待事件和sql效能診斷方面記載一二。

資料庫效能瓶頸方面,可能第一反應便是oracle的等待事件,而v$event_name檢視記錄了當前資料庫支援的等待事件及其基本資訊,parameter1,parameter2,parameter3對於不同的等待事件的意思各不相同。

Oracle等待事件分為:既空閒idle等待事件和非空閒non-idle等待事件。空閒等待事件指oracle正等待某種工作,在診斷和最佳化資料庫的時候,不用過多注意,stat$idle_event檢視記錄的則是空閒等待事件。非空閒等待事件專門針對oracle活動,指資料庫任務或應用執行過程中發生的等待,當然這些等待需要關注於 研究調整。

可以透過v$event_name檢視檢視各類等待事件

SQL> col wait_class for a20;

SQL> select wait_class,wait_class#,wait_class_id,count(*) from v$event_name group by wait_class,wait_class#,wait_class_id;

WAIT_CLASS WAIT_CLASS# WAIT_CLASS_ID COUNT(*)

-------------------- ----------- ------------- ----------

Idle 6 2723168908 62

Cluster 11 3871361733 47

Administrative 3 4166625743 46

Scheduler 10 2396326234 2

System I/O 9 4108307767 24

Concurrency 4 3875070507 24

Configuration 2 3290255840 23

Other 0 1893977003 588

Application 1 4217450380 12

Network 7 2000153315 26

User I/O 8 1740759767 17

Commit 5 3386400367 1

12 rows selected

同樣也可以檢視v$system_wait_class檢視獲得各類主要等待事件的等待事件和等待次數資訊

SQL> select * from v$system_wait_class;

WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED

------------- ----------- -------------------- ----------- -----------

1893977003 0 Other 1468 3654

4217450380 1 Application 2819 86

3290255840 2 Configuration 2 82

3875070507 4 Concurrency 490 2639

3386400367 5 Commit 3306 2420

2723168908 6 Idle 203983 72024430

2000153315 7 Network 46096 37

1740759767 8 User I/O 9609 40303

4108307767 9 System I/O 45639 14443

9 rows selected

V$sessionv$session_wait

在關注oracle的效能,這兩個檢視經常被應用,從oracle 10gR1中,v$session中增加了關於等待事件的欄位,實際上也就是把v$session_wait檢視中的所有欄位全部整合到v$session檢視中。V$session中的eventP1TEXT描述具體引數,P1代表十進位制定義的引數,p1raw十六進位制表示的引數值等,又增加了service_namesql_tracesql_trace_waitssql_trace_binds,顯示了當前session連線方式及是否啟用sql_trace跟蹤。由於v$session記錄的是動態資訊,隨著session的生命週期相關,oracle又提供了另一個檢視v$system_event記錄資料庫自啟動以來的所有等待事件資訊。

這裡說一下關於db file scattered read等待事件而查詢相應的sessionsql語句,找到問題根本。

select a.sql_text

from v$sqltext a where (a.hash_value,a.address) in (select b.sql_hash_value,sql_address

from v$session b

where b.sid=&sid);

這裡先從v$session_wait找到相關等待事件的sid,然後透過聯合v$session檢視進而獲得v$session檢視的sql_hash_value,sql_address最後聯合v$sqltext找到等待事件的sessionsql語句,進而運用10046sql_traceautotrace檢視相應的sql語句進而調整。

[@more@]

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

相關文章