等待事件概覽
* v$event_name:這個視圖記錄着當前數據庫支持的等待事件及其基本信息
* Oracle 的等待事件主要能夠分爲兩類,即空閒(idle)等待事件和非空閒(non-idle)等待事件。
空閒事件指 Oracle 正等待某種工做,在診斷和優化數據庫的時候,咱們不用過多注意這部分事件。
非空閒等待事件專門針對 Oracle 的活動,指數據庫任務或應用運行過程當中發生的等待,這些等待事件是咱們在調整數據庫的時候應該關注與研究的。
等待事件分類
* Oracle 11g R2中主要分類及各種等待事件的個數
SELECT wait_class#, wait_class_id, wait_class, COUNT (*) AS "count"
FROM v$event_name
GROUP BY wait_class#, wait_class_id, wait_class
ORDER BY wait_class#;
WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS count
----------- ------------- ---------------------------------------------------------------- ----------
0 1893977003 Other 958
1 4217450380 Application 17
2 3290255840 Configuration 24
3 4166625743 Administrative 55
4 3875070507 Concurrency 33
5 3386400367 Commit 2
6 2723168908 Idle 96
7 2000153315 Network 35
8 1740759767 User I/O 48
9 4108307767 System I/O 32
10 2396326234 Scheduler 8
11 3871361733 Cluster 50
12 644977587 Queueing 9
13 rows selected.
SQL>
從等待發現歷史瓶頸
* 經過查詢 V$SYSTEM_WAIT_CLASS 視圖得到各種主要等待事件的等待時間和等待次數等信息,經過分類以及統計信息,能夠很直觀地快速得到數據庫的總體印象。
SQL> set numwidth 30
SQL> select * from v$system_wait_class order by time_waited;
WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS TOTAL_WAITS TIME_WAITED TOTAL_WAITS_FG TIME_WAITED_FG
------------- ----------- ---------------------------------------------------------------- ----------- ----------- -------------- --------------
2396326234 10 Scheduler 4882 3504 4654 3246
3386400367 5 Commit 5175978 573796 5165499 572165
2000153315 7 Network 777336459 749926 769131912 748125
4217450380 1 Application 4434302 7381881 4397678 7364695
1893977003 0 Other 100729436 17616970 8174372 16305755
1740759767 8 User I/O 6181252645 25640434 6153846672 24928475
3875070507 4 Concurrency 31874404 27587290 31626616 22056683
4166625743 3 Administrative 93480936 55969848 4832 184803
4108307767 9 System I/O 557921472 74836663 77811450 339619
3290255840 2 Configuration 2617482 105558521 2595392 99440746
2723168908 6 Idle 1034274573 1.1087E+11 746393167 3.2167E+10
* 相關視圖:
V$SESSION(V$SESSION_WAIT):會話當前正在發生的事件
V$SESSION_EVENT :活動會話在其生命週期經歷的事件(對V$SESSION的累積)
V$SYSTEM_EVENT :做爲數據庫總體等待事件保存(對V$SESSION_EVENT的累積)
注意,V$SESSION_EVENT 或者 V$SYSTEM_EVENT 視圖的累積信息以及關於等待的平均計算,使咱們沒法得知個別等待消耗的時間長短。爲了解決這一問題,Oracle 10g 引入了一個新的視圖 v$event_histogram,經過這個視圖可
以看到等待事件的柱狀圖分佈,從而能夠對一個等待事件的具體分佈有進一步的瞭解。在如下查詢輸出中能夠看到,cursor: pin S wait on X 的競爭主要是 16至512 毫秒的競爭。可是注意等
待時間在 4096 毫秒左右的等待也有 2 次。
SQL> set numwidth 30
SQL> SELECT event, wait_time_milli, wait_count
2 FROM v$event_histogram WHERE event = 'cursor: pin S wait on X';
EVENT WAIT_TIME_MILLI WAIT_COUNT
---------------------------------------------------------------- ------------------------------ ------------------------------
cursor: pin S wait on X 1 23116
cursor: pin S wait on X 2 14786
cursor: pin S wait on X 4 28929
cursor: pin S wait on X 8 55937
cursor: pin S wait on X 16 59049323576
cursor: pin S wait on X 32 440755320
cursor: pin S wait on X 64 8417963
cursor: pin S wait on X 128 4674251
cursor: pin S wait on X 256 13744
cursor: pin S wait on X 512 379
cursor: pin S wait on X 1024 27
cursor: pin S wait on X 2048 0
cursor: pin S wait on X 4096 2
13 rows selected.
SQL>
從等待肯定當前瓶頸
* ASH
* 肯定當前主要影響性能的等待事件
col event format a30
col p1text format a20
select sid,event,p1,p1text from v$session where event not like '%client%';
* 捕獲相關sql
spool /home/oracle/sqltext.txt
select sql_text from v$sqltext a
where a.hash_value = (select sql_hash_value from v$session b where b.event = '經過上條SQL獲取等待事件')
order by piece asc;
spool off