您现在的位置: 万盛学电脑网 >> 程序编程 >> 数据库 >> oracle教程 >> 正文

Oracle数据库缓冲区忙等待的原因解析

作者:佚名    责任编辑:admin    更新时间:2022-06-22

众多Oracle有关问题中,其中最重要的一个是缓冲区忙等待(buffer busy wait)事件。

缓冲区忙等待是I/O-bound Oracle系统中最常见的现象,尤其是在Oracle STATSPACK报告的前五个忙等待的读(顺序/分散)系统中,如前5个定时事件:% 总和事件等待  时间(s)消逝时间
--------------------------- ------------ ----------- -----------
db文件顺序读 2,5987,146  48.54
db文件分散读25,5193,246  22.04
库缓冲区载入死锁6731,3639.26
CPU时间 2,154 9347.83
日志文件平行写  19,157 8375.68

减轻缓冲区忙等待的主要方式是减少系统中的I/O,这可以通过SQL使用更少的块读(block reads,比如添加索引)的方式得以实现。即使对于一个比较大的db_cache_size,我们也可以减少缓冲区忙等待的时间。

为了能够查看整个系统的等待事件,我们可以查阅v$system_event性能视图。这一性能视图提供了等待事件的名称,等待事件与时间的总和,以及每一事件的平均等待时间。

可以通过v$waitstat视图来查询导致等待的缓冲区的类型。这一视图列出了每一缓冲区类型的等待,COUNT是类所有的等待总和,TIME是这一类所有等待的时间总和,如下所示: select * from v$waitstat;
 类  COUNT  TIME
------------------ ---------- ----------
data block19611131870278
segment header 34535 159082
undo header233632 86239
undo block  1886  1706

当一个session访问缓冲区的块时,就有可能产生缓冲忙等待。这一缓冲区忙等待的产生可能由以下的原因造成的:

块可能被其它的session读到缓冲区,所以session必须等待块的读入结束。

session可能有与等待的session查询不协调的缓冲块。

由于缓冲区忙等待是由不同特定的块之间的竞争而造成的,所以只能通过识别哪些块发生冲突和冲突产生的原因,你才有可能做出判断,相应的调整包括识别和消除块竞争的原因。

v$session_wait性能视图,提供了识别等待产生原因的方法。

v$session_wait视图的列代表的缓冲区忙等待事件如下:

P1—与等待相关的数据文件的全部文件数量。

P2—P1中的数据文件的块数量。

P3—描述等待产生原因的代码。

这里是一个这些值的Oracle数据词典查询: select
  p1 "File #".
  p2 "Block #",
  p3 "Reason Code"
from
  v$session_wait
where
  event = 'buffer busy waits';

  • 共2页:
  • 上一页
  • 1
  • 2
  • 下一页