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

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Oracle数据库缓冲区忙等待的原因解析

众多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;   如果以上查询的结果显示一个块在忙等待,以下的查询将显示这一块的名称和类型:   select   owner,   segment_name,   segment_type from   dba_extents where   file_id = P1 and  P2 between block_id and block_id + blocks -1;   一旦这一块被识别,v$segment_statistics性能视图促使块水平统计的实时监控。这一过程使得DBA识别与独立列表与索引有关的问题。 我们也可以查询dba_data_files以确定卷入等待的文件的file_name,方法是使用v$session_wait中的P1。 从v$session_wait中查询P3(原因编码)的值可以知道session等待的原因。原因编码的范围从0到300,并可以解码。 在一个SCUR或XCUR缓冲区产生且没有结束的改变。 0 块被读入缓冲区。 100 我们想要NEW(创建)一个块,但这一块当前被另一session读入。 110 我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等待read()结束。 120 我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等待他人的读入结束。 130 块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR。 200 我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结束。 210 Session想读入SCUR或XCUR中的块,如果块交换或者session

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档