专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 缓冲区溢出:数据库管理:Oracle 缓冲区忙等待的原因 »正文

缓冲区溢出:数据库管理:Oracle 缓冲区忙等待的原因

来源: 发布时间:星期三, 2008年12月24日 浏览:2次 评论:0
="t18">
  众多Oracle有关问题中其中最重要个是缓冲区忙等待(buffer busy wait)事件缓冲区忙等待是I/O-bound Oracle系统中最常见现象尤其是在Oracle STATSPACK报告前 5个忙等待读(顺序/分散)系统中正如:
  
  前5个定时事件
  
  align=left>                            
  
  % 总和事件            等待      时间(s)    消逝时间
  --------------------------- ------------ ----------- -----------
  db文件顺序读           2,598    7,146      48.54
  db文件分散读          25,519    3,246      22.04
  库缓冲区载入死锁          673    1,363      9.26
  CPU时间           2,154     934      7.83
  日志文件平行写          19,157     837      5.68
  
  减轻缓冲区忙等待主要方式是减少系统中I/O这可以通过SQL使用更少块读(block reads比如添加索引)方式得以实现即使对于个比较大db_cache_size我们也可以减少缓冲区忙等待时间
  
  为了能够查看整个系统等待事件我们可以查阅v$system_event性能视图性能视图如表A所示提供了等待事件名称等待事件和时间总和以及每事件平均等待时间
  
  可以通过v$waitstat视图来查询导致等待缓冲区类型视图列出了每缓冲区类型等待COUNT是类所有等待总和TIME是这类所有等待时间总和如下所示:
  
  select * from v$waitstat;
  
   类          COUNT    TIME
  ------------------ ---------- ----------
  data block      1961113  1870278
  segment header     34535   159082
  undo header      233632   86239
  undo block        1886    1706
  
  当个session访问缓冲区块时就有可能产生缓冲忙等待缓冲区忙等待产生可能由以下原因造成:
  
  块可能被其它session读到缓冲区所以session必须等待块读入结束
  
  session可能有和等待session查询不协调缓冲块
  
  由于缓冲区忙等待是由区别特定块的间竞争而造成所以只能通过识别哪些块发生冲突和冲突产生原因你才有可能做出判定相应调整包括识别和消除块竞争原因
  
  v$session_wait性能视图如表B所示提供了识别等待产生原因思路方法
  
  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识别和独立列表和索引有关问题如图C
  
  我们也可以查询( 表D) dba_data_files以确定卷入等待文件file_name思路方法是使用v$session_wait中P1
  
  从v$session_wait中查询P3(原因编码)值可以知道session等待原因原因编码范围从0到300并可以解码如表A所示
  
  表 A 编码 等待原因 - 在个SCUR或XCUR缓冲区产生且没有结束改变.
  
  0 块被读入缓冲区
  100 我们想要NEW(创建)个块但这块当前被另session读入
  
  110 我们想将当前块设为共享但这块被另session读入所以我们必须等待read结束
  
  120 我们想获得当前但其他人已经将这块读入缓冲区所以我们只能等待他人读入结束
  
  130 块被另session读入而且没有找到其它协调所以我们必须等待读结束缓冲区死锁后这种情况也有可能产生
所以必须读入块CR
  
  200 我们想新创建个block但其他人在使用所以我们只好等待他人使用结束
  
  210 Session想读入SCUR或XCUR中假如块交换或者session处于非连续TX模式所以等待可能需要很长时间
  
  220 在缓冲区查询个块当前版本但有人以不合法模式使用这所以我们只能等待
  
  230 以CR/CRX方式获得个块但块中更改开始并且没有结束
  
  231 CR/CRX扫描找到当前块但块中更改开始并且没有结束
  
  原因编码
  正如我在开始时所说那样缓冲区忙等待是I/O bound系统中最常见现象数据块等待导致I/O竞争通常是由当扫描相同索引时多个session重复读入相同在这样情况下session 1快速扫描缓冲区然后块从磁盘被读入当session 1等待磁盘读完成过程中其它块扫描相同索引并很快捕捉session 1并想从磁盘上读入相同由此产生了缓冲区忙等待
  
  以下规则有助于解决提及当处于竞争时情况:
  
  数据块竞争—通过改变PCTFREE或者PCTUSED值来识别和消除HOT块以减少数据块数量
  
  Freelist块竞争—增加FREELISTS值当使用Parellel服务器时定确保每事例有自己FREELIST GROUPs
  
  Segment header竞争—增加FREELISTS值并使用FREELIST GROUPs
  
  Undo header块—增加回滚段(rollback segments)数量
  
  好处
  缓冲区忙等待识别和解决是比较复杂和棘手Oracle提供了v$segment_statistics视图有助于监视缓冲区忙等待当能够正确地识别和修正缓冲区忙等待原因时你所努力付出定会得到回报

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: