视图v$session,v$session_wait,v$session_wait_history,v$session_event,v$system_event提供了等待哪些资源以及每种资源等待的时间(timed_statistics参数为TRUE)等信息。
进行性能调优时,调查等待事件以及相关的计时数据,占用最多时间的事件常常是性能瓶颈的标志。
下面介绍常用的等待事件:
buffer busy waits
1、描述
该等待事件显示多个进程试图同时访问缓冲区缓存中的一些缓冲区。查询V$waitstat可得到每个缓冲区的等待统计信息。具有缓冲区繁忙等待的公共缓冲区类包括数据块、段头、撤销头和撤销块。
SQL> SELECT t.name,
t.parameter1,
t.parameter2,
t.parameter3,
t.wait_class
FROM v$event_name t
WHERE t.name = 'buffer busy waits';
NAME PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS
-------------------- ---------- ---------- ---------- ---------------
buffer busy waits file# block# class# Concurrency
查看v$session_wait视图,参数P1、P2、P3分别对应File ID、Block ID和Class ID。
2、原因
当buffer busy waits出现时,查询V$session视图识别Row_wait_obj#,例如:
SQL> select row_wait_obj#
2 from v$session
3 where event='buffer busy waits';
查询dba_objects识别争用的对象及类型,例如:
SQL> select owner,object_name,subobject_name,object_type
2 from dba_objects
3 where data_object_id=&row_wait_obj;
3、解决办法
所需要的操作依赖于争用的数据块和实际的段。
1)段头(segment header)
如果争用发生在段头,那么很可能是free list争用。
在本地管理的表空间中,自动段空间管理消除了指定pctused、freelists和freelist groups参数,如果需要,切换手动空间管理为自动段空间管理(ASSM)。
如果不使用ASSM(例如,表空间使用字典空间管理),可参考下面信息:
free list是一个空闲数据块的列表,通常包括在段内的几个不同区中的数据块。free lists是由空闲空间内尚未达到pctfree的数据块或者已经收缩到pctused下的使用过的空间组成。使用freelists参数指定处理空闲列表的数量,默认值是1,最大值取决于数据块大小。
可利用下面的SQL查看当前freelist的设置:
SQL> select segment_name,freelists
2 from dba_segments
3 where segment_name=&segment_name
4 and segment_type=&segment_type;
然后设置free lists,或者增大free lists的值。
2)数据块(data block)
如果争用发生在表或者索引(不是段头):
- 检查右索引,这些是被许多进程在同一点插入的索引,例如:使用序列生成的值;
- 考虑使用ASSM、全局哈希分区索引,或者增加freelists避免多个进程视图插入同一数据块。
3)撤销头(undo header)
对于争用发生在回滚段头,如果没有使用自动UNDO管理,那么就增加更多的回滚段。
4)撤销块(undo block)
对于争用发生在回滚段数据块,如果没有使用自动UNDO管理,那么考虑增大回滚段的大小。
db file scattered read
1、描述
该等待事件显示用户进程正在将缓冲区读取到SGA缓冲区缓存中,并等待物理I/O调用返回。db file scattered read进行离散读将数据读入多个不连续的内存位置。离散读是一个多数据块读,通常发生在索引快速全扫描和全表扫描。
db file scattered read等待事件显示发生了全表扫描&#