基于性能上的考慮,服務器進程在掃描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等待事件則常由存儲性能問題引起。