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