文档介绍:广州远佳信息科技有限公司
Oracle 数据库教程
—— oracle 常见的等待事件说明
1. Buffer busy waits
从本质上讲,这个等待事件的产生仅说明了一个会话在等待一个 Buffer(数据块),但是导致这个现象的
原因却有很多种。常见的两种是:
--当一个会话视图修改一个数据块,但这个数据块正在被另一个会话修改时。
--当一个会话需要读取一个数据块,但这个数据块正在被另一个会话读取到内存中时。
在新的版本中,第二种情况已经被独立出来,以 read by other session 取代~
Buffer busy waits 等待事件常见于数据库中存在的热快的时候,当多个用户频繁地读取或者修改同样的
数据块时,这个等待事件就会产生。如果等待的时间很长,我们在 AWR 或者 statspack 报告中就可以看
到。
这个等待事件有三个参数。查看有几个参数我们可以用以下 SQL:
SQL> select name, parameter1, parameter2, parameter3 from v$event_name where name='buffer busy
waits';
NAME PARAMETER1 PARAMETER2 PARAMETER3
-------------------- ---------- ---------- ----------
buffer busy waits file# block# class#
latch
内存中数据块的存放位置是记录在一个 hash 列表(cache buffer chains)当中的。当一个会话需要访问
某个数据块时,它首先要搜索这个 hash 列表,从列表中获得数据块的地址,然后通过这个地址去访问需
要的数据块,这个列表 Oracle 会使用一个 latch 来保护它的完整性。当一个会话需要访问这个列表时,
需要获取一个 Latch,只有这样,才能保证这个列表在这个会话的浏览当中不会发生变化。
产生 buffer latch 的等待事件的主要原因是:
Buffer chains 太长,导致会话搜索这个列表花费的时间太长,使其他的会话处于等待状态。
同样的数据块被频繁访问,就是我们通常说的热快问题。
这个等待事件有两个参数:
Latch addr: 会话申请的 latch 在 SGA 中的虚拟地址,通过以下的 SQL 语句可以根据这个地址找到它对应
的 Latch 名称:
select * from v$latch a,v$latchname b where addr=latch addr and #=#;
广州远佳信息科技有限公司
chain#: buffer chains hash 列表中的索引值,当这个参数的值等于 s 0xfffffff 时,说明当前的会话
正在等待一个 LRU latch。
file parallel write
当数据库中有多个控制文件的拷贝时,Oracle 需要保证信息同步地写到各个控制文件当中,这是一个并行
的物理操作过程,因为称为控制文件并行写,当发生这样的操作时,就会产生 control file parallel write
等待事件。
控制文件频繁写入的原因很多,比如:
--日志切换太过频繁,导致控制文件信息相应地需要频繁更新。
--系统 I/O 出现瓶颈,导致所有 I/O 出现等待。
这个等待事件包含三个参数:
--Files: Oracle 要写入的控制文件个数。
--Blocks: 写入控制文件的数据块数目。
--Requests:写入控制请求的 I/O 次数。
file sequential read
当数据库需要读取控制文件上的信息时,会出现这个等待事件,因为控制文件的信息是顺序写的,所以读
取的时候也是顺序的,因此称为控制文件顺序读,它经常发生在以下情况:
--备份控制文件
--RAC 环境下不同实例之间控制文件的信息共享
--读取控制文件的文件头信息
--读取控制文件其他信息
这个等待事件有三个参数:
--File#:要读取信息的控制文件的文件号。
--Block#: 读取控制文件信息的起始数据块号。
--Blocks:需要读取的控制文件数据块数目。
file parallel read
这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行 DML)没有
关系。这个事件发生在数据库恢复的