10.2.3表的等待事件及其潛在的原因
10.2.4與解析相關的統計信息
SELECT NAME, VALUE
FROM V$SYSSTAT
WHERE NAME IN ( 'parse time cpu', 'parse time elapsed',
'parse count (hard)', 'CPU used by this session' );
1.比值parse time CPU / parse time elapsed越接近於1,表明解析過程中在等待高爭用資源時的時間越少。
2.比值parse time CPU / CPU used by this session越接近於0,表明CPU用於解析SQL越少。
10.3 等待事件統計信息
1.SQL*Net Events
2.buffer busy waits
3.db file scattered read
4.db file sequential read
5.direct path read and direct path read temp
6.direct path write and direct path write temp
7.enqueue waits
8.events in wait class other
9.free buffer waits
在單CPU而無法使用多DBWR(通過系統變量DB_WRITER_PROCESSES 設置,參數類型:integer ),且異步(asynchronous)I/O不可用的情況下,多個I/O從進程(mutiple I/O slaves,通過系統變量DB_IO_SLAVES 設置,參數類型:integer )是很有用的解決辦法。I/O從進程只能用於單DBWR進程下。
一般DBWR遇到瓶頸問題時,首先考慮的是系統是否支持異步I/O,在肯定的情況下設置異步I/O(通過系統變量DISK_ASYNCH_IO 設置,參數類型:boolean ,可選值:true、false),然後觀察問題是否得到緩解。其次,如果系統在異步I/O不可用,或者異步I/O已經設置時,DBWR仍存在瓶頸的情況下,那麼再考慮使用設置多DBWR進程來解決。最後,僅當無法配置多DBWR進程的情況下,使用I/O slaves
10.latch events
Table 10-2 Latch Wait Event
通過以下語句查詢有可能未進行綁定變量的SQL
1. SELECT SQL_TEXT
FROM V$SQL
WHERE EXECUTIONS < 4
ORDER BY SQL_TEXT;
2.SELECT SUBSTR(SQL_TEXT, 1, 60), COUNT(*)
FROM V$SQL
WHERE EXECUTIONS < 4
GROUP BY SUBSTR(SQL_TEXT, 1, 60)
HAVING COUNT(*) > 1;
執行次數(EXECUTIONS)越少,SQL越相似,未進行綁定變量的可能性越大。
3.SELECT SQL_TEXT FROM V$SQL WHERE PLAN_HASH_VALUE IN
(SELECT PLAN_HASH_VALUE
FROM V$SQL
GROUP BY PLAN_HASH_VALUE HAVING COUNT(*) > 4)
ORDER BY PLAN_HASH_VALUE;
以上當PARSE_CALLS越接近
於 EXECUTIONS時,表明你在持續的重新解析這個SQL,
PARSE_CALLS較高的SQL意味着需要優化了。
11.log file parallel write
12.library cache pin
13.library cache lock
14.log buffer space
一般原因是重做日誌的產生速度快於LGWR從日誌緩存寫出至日誌文件的速度。解決辦法:一:是否log buffer太小。二:系統是否存在I/O瓶頸。
15.log file switch
一般發生於日誌文件轉換(一:歸檔需求。二:檢測點不完整)
16.log file sync
一、如果平均等待時間低,而等待次數較高時,查看應用程序中是否每次INSERT後執行了commit操作,使用批量提交(batching COMMITs)可降低等待次數。
二、如果平均等待時間較高,檢查何問題造成大量的等待時間,例如,是緩慢的I/O,則可嘗試以下辦法解決。
1.減少重做日誌日誌文件所在硬盤的I/O操作,或者爲重做日誌更換專用硬盤。
2.爲歸檔日誌備用不通的磁盤,使日誌寫進程歸檔操作所帶來的的影響最小華。
3.將重做日誌轉移至更快的磁盤設備或者I/O子系統(例如,將磁盤陣列RAID5換爲RAID1方式)
4.考慮使用裸設備(或者磁盤廠商所提供的模擬裸設備)提高寫入速度。
5.具體應用程序中,採用批量每N行數據提交,替代每行數據提交的做法。
17.rdbms ipc reply
等待一個後臺進程的回覆
10.4空閒等待進程
Table 10-3 Idle Wait Events
Wait Name | Background Process Idle Event | User Process Idle Event | Parallel Query Idle Event | Shared Server Idle Event | Oracle Real Application Clusters Idle Event |
---|---|---|---|---|---|
|
. |
. |
. |
X |
. |
|
. |
X |
. |
. |
. |
|
X |
. |
. |
. |
. |
|
. |
. |
X |
. |
. |
|
. |
. |
X |
. |
. |
|
X |
. |
. |
. |
. |
|
X |
. |
. |
. |
. |
|
. |
X |
. |
. |
. |
|
. |
. |
. |
X |
. |
查詢某個會話的各個等待事件
1.select
a.sid,
a.event,
a.time_waited,
round(a.time_waited/c.sum_time_waited*
100
,
2
)
||
'%'
pct_wait_time,
round((
sysdate
- b.LOGON_TIME) *
24
) hours_connected
from
v$session_event a,
v$session
b,
(
select
sid,
sum
(time_waited) sum_time_waited
from
v$session_event
where
event
not
in
(
'null event'
,
'SQL*Net message to client'
,
'pmon timer'
,
'pipe get'
,
'smon timer'
,
'jobq slave wait'
,
'rdbms ipc
message'
,
'rdbms ipc
reply'
,
'PX Deq: Join
ACK'
,
'PX Deq: Signal ACK'
)
having
sum
(time_waited) >
0
-- 對group by
產生結果的挑選
group
by
sid) c
where
a.sid =
b.sid
and
a.sid = c.sid
and
a.TIME_WAITED >
0
and
a.sid = &1
order
by
hours_connected
desc
, pct_wait_time
2.查詢各會話等待事件
select sid,event,p1,p1text from v$session_wait;
3.查詢具體會話運行中的sql語句
SELECT sql_text
FROM v$sqltext a
WHERE a.hash_value = (SELECT sql_hash_value
FROM v$session b
WHERE b.SID = &sid)
ORDER BY piece ASC