问题
set line 120
select SQL_ID,event,count(*) from gv$session where wait_class <> 'Idle' group by event,SQL_ID order by count(*);
排查思路
oracle等待事件之free buffer waits Free buffer waits 等待事件总结 free buffer waits
尝试解决方案
修改db_writer_processes参数为5,重启数据库。
猜测原因
当需要在buffer cache中寻找可用块但是找不到时,就会发生这个等待。那么修改了db_writer_processes参数后,刷脏快了,buffer里面的free就多了,就不会有这个等待事件了?
Free Buffer waits等待事件
当进程在buffer cache中找不到空闲的buffer时会向DBWR进程发出写入请求,直到DBWR进程完成,在这期间就会产生该等待事件。
产生原因:
- 检查db_writer_processes参数,默认每8个CPU会有一个dbwr进程;
- SQL效率差,物理读过大或者要构造的CR块过多,比如大表select *,笛卡尔积等;
- DBWR进程写缓慢或DBWR进程的工作量过多;
- 存储性能有问题,可能写脏数据慢,可能写redo慢;
- 延迟块清除,这种行为可能会占用大量的buffer;
- db_cache_size值太小,一般由Oracle管理,默认为0;
相关视图
select name,parameter1,parameter2,parameter3,wait_class from v$event_name where name ='free buffer waits';
NAME PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS
free buffer waits file
select * from v$sysstat where name in ('free buffer inspected','free buffer requested');
STATISTIC
147 free buffer requested 8 177300 3411924934
151 free buffer inspected 8 7 941676439
free buffer inspected:扫描LRU链寻找可重用的块时候跳过的块的个数 free buffer requested:请求重用块的次数
|