Freebufferwaits等待事件总结

浏览:
字体:
发布时间:2013-12-20 16:18:47
来源:

Free buffer waits

1.简述: 当数据库要在buffer cache中寻找空闲空间来放置数据,但发现空间不足时,就会产生这个等待;

2.详述:

a) 在用户请求块的DBA上应用HASH函数,获得适当的hash bucket;

b) 检索bucket对应的chain,确认块头是否存在,若存在就使用;

c) 若不存在,用户进程在LRU链上按最近最少使用的顺序寻找空闲缓冲区。若在此过程中发现脏块,则将其移到LRUW列。找到空闲缓冲区后,就可以从数据文件将块读到该缓冲区上;

d) 在LRU列上寻找,一般扫描40%的比例,扫完后没有发现空闲缓冲区,就会停止扫描并驱使DBWR将脏块写到磁盘上;

e) 在等待dbwr写脏块的过程中,用户进程在等待free buffer waits事件。

3.原因:三部分

1.data buffer太小,导致空闲空间不够

2.脏块写得慢。

a) 内存中的脏数据太多,DBWR无法及时将这些脏数据写到磁盘中以释放空间,也就是可能有批量dml操作。

b) dbwr数太少,db_writer_processes参数是否设得过少,配合os上的ps -ef | grep $ORACLE_SID | grep dbw查看dbwr数量

c) 缓慢的IO子系统,db file parallel write较多,v$log视图发现日志很难被重用因为checkpoint得慢,

d) 延迟块清除,即延迟块头事务标记清除。

3.要申请的空间过多

a) 低效率的SQL语句导致过量的物理读。

4.附录: 前台进程扫描lru链表,看有没空闲的空间,一般要扫到预定义的限度才停止扫描,这个限度是LRU链表的百分比,9i中默认40%,可以通过查询。 select * from x$kvit where kvittag = 'kcbfsp';或者查询参数 _db_block_max_scan_pct 也是40. 出现场景:imp,impdp导数进库也可能出现这个等待。 这个等待事件包含2个参数: File#: 需要读取的数据块所在的数据文件的文件号。 Block#: 需要读取的数据块块号。 什么是延迟块清除? 在事务提交前,这个事务修改得block已经被dbwr写到disk中去了。我们知道,块头会记录这个块有活动事务存在,后来这个事务commit时,oracle不可能再把它读回到内存中来修改块头。只能等下回用它时,到undo段里查询事务记录后,再修改块标志为已commit。比如如果对一个大表有delete操作,后续有人对这个表有select操作,因为延迟块清除的特性,就会占用大量buffer。这也是为什么select也会产生redo的原因。(select的时候要修改块头) delay block cleanout : 主要针对大事务,可能在commit的时候,一些数据脏快已写入数据文件,提交时,无法把这些数据块标记commit,该数据块的下一个读者对其进行delay block cleanout 。数据块的下一个读者首先检查该块的事务状态是否为活动,不活动的话,修改事务的标志(flag)。这样可以避免不必要的事务读。

>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();