基于性能上的考虑,服务器进程在扫描LRU主列的同时,会将脏块移至LRU-W列,如果发现没有足够可用(可替换)的BUFFER CACHE,进程并不会无止尽地扫描整条LRU主列,而是在扫描到某个阀值(该阀值由隐含参数_db_block_max_scan_pct决定。不同的版本,该隐含参数值可能会不同,在Oracle 10g中默认值为40)后就停止扫描。这时,前台进程会通知DBWR进程将相关脏块写进数据文件中,以得到空闲缓冲区。DBWR进程写脏块完成之前,服务器进程等待空闲缓冲区时会出现FREE BUFFER WAITS等待事件。FREE BUFFER WAITS等待事件通常是由以下原因引起的:
低效的SQL。低效的SQL会过多请求空闲缓冲区,因此FREE BUFFER WAITS等待也会响应增加。
BUFFER CACHE过小。这个比较好理解。
DBWR进程写脏块的速度不够快。可以通过改善存储性能、使用多个DBWR进程来加快DBWR进程写脏块的速度。
DBWR进程将脏块写到数据文件时,将会以EXCLUSIVE模式占有脏缓冲区。此时,如果有其他进程要读取或修改缓冲区,则需要等待DBWR进程写数据块结束,并出现WRITE COMPLETE WAITS等待事件。当出现WRITE COMPLETE WAITS事件时,存储存在性能问题的可能性比较高。
提示 请读者仔细体会FREE BUFFER WAITS等待事件和WRITE COMPLETE WAITS等待事件的区别。根据经验,FREE BUFFER WAITS等待事件常由应用引起,而WRITE COMPLETE WAITS等待事件则常由存储性能问题引起。