网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  教你快速的解决oracle缓冲区忙等待事件     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:124次  录入:管理员--2007-11-15  
 

缓冲区忙等待是i/o-bound oracle系统中比较常见的现象,特别是在oracle statspack报告的前五个忙等待的读(顺序/分散)系统中,如前5个定时事件:

  

% 总和事件       等待      时间(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性能视图。这一性能视图提供了等待事件的名称,等待事件与时间的总和,以及每一事件的平均等待时间。

可以通过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性能视图,提供了识别等待产生原因的方法。

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;

1 2 下一页>>


一旦这一块被识别,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处于非连续的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视图有助于监视缓冲区忙等待。当你能够正确地识别和修正缓冲区忙等待的原因时,你的付出肯定会得到回报的。

 
 
上一篇: 怎样不安装oracle客户端也可以系统移植    下一篇: 快速掌握ora-00600 4194错误的解决方法
  相关文档
监控数据库性能的"sql"语句都有哪些? (1) 02-27
分享Oracle9i中建立自增字段的最新办法 08-05
轻松掌握oracle peeking 绑定变量的控制 11-15
关于Oracle进程结构及后台进程简介 04-11
教你在Oracle中实现数据自动导入导出 04-12
怎样获取或记录 oracle 语句的执行时间 11-21
教你利用Rownum来限制查询所返回的行数 06-17
Oracle 9i中自动撤销管理的优点分析 04-11
快速掌握重启oracle数据库的操作步骤 04-17
教你使用智能优化器提高Oracle性能极限 05-27
oracle的共享封锁 独占封锁和共享更新封锁 (1) 05-28
windows环境下oracle监听服务启动的问题 07-15
oracle 9.2.0.1版本函数编译的一个bug 03-20
存储在数据库中的过程——数据库触发器 09-29
pfile创建spfile后数据库无法启动的问题 02-27
使用T-SQL操作面试SQL Server开发人员 07-07
将移动数据文件到其它目录下的实用方法 03-03
数据库迁移的几种常用方式及优缺点比较 05-14
如何使用分析函数来进行行和列的转换 03-26
讲解oracle面试过程中常见的二十个问题 04-24
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息