为什么会产生这个等待事件?很直接的一个反应是data buffer不够大。这是可能原因之一:
原因还有其它如:
1.DBWn进程写速度不够快,或触发不够勤快,或有没有使用足够DBWn进程。
2.系统本身I/O速度比较慢。
3.延迟块清除。
4.SQL语句太滥。
这么多原因如何判断具体是那个原因导致这个等待事件?
如果Buffer cache size不够大。
有可能所有buffer都在使用中,且没有dirty buffer可写。(这个情况表时你的buffer也太小了。)
还有可能有dirty buffer可写,但是频繁从把dirty buffer写到磁盘上,导致大量物理读,和比较低的缓存命中率。
还有一种可能是系统有dirty buffer可写,但没I/O速度慢或DBWR来不及,有很多该写但末写的dirty buffer堵在cache buffer里,导致了freebuffer waits事件。
由于现在buffer越来越大,所以Oracle把一个大buffer分几个工作集。每一个工作集有各自的LRU LRUW list.DBWR进程个数由DB_WRITER_PROCESSES 参数确定。然后oracle把DBWR进程分给几个工作集使用。如果你有一个很大buffer,有几个工作集,系统又比较繁忙,(写操作量也比较大)但只有一个DBWR,那明显DBWR数量不够。
跟DBWR相关的还有一种办法增强ckpt触发的频率,但这样会有一个弊处就是会占比较多I/O资源。There is no such thing as free lunch!