如果访问的数据块不在buffer cache中,就需要扫描LRU链表(寻找free buffer),当达到扫描块数限制后(40%)还没有找到空闲buffer,就需要通知DBW0将脏缓存回写到磁盘。(如果checkpoint queue达到了25%,也会出发DBWn进程去写脏数据).在这种情况下,用户进程访问一个数据块的过程是最长的,也就是效率最低的。如果一个系统中存在大量的脏缓冲,那么就可能导致用户进程访问数据性能下降。
以上提到的两个百分比可以通过以下两条命令查到:
select kvittag,kvitval,kvitdsc from x$kvit
where kvittag='kcbldq';
select kvittag,kvitval,kvitdsc from x$kvit
where kvittag='kcbfsp';
我们可以通过人工干预将所有脏缓冲回写到磁盘去,这就是flush buffer。
在9i,可以用以下语句:
alter system set events = 'immediate trace name flush_cache'; --9i
在10g,可以用以下方式(9i的方式在10g仍然有效):
alter system flush buffer_cache;
另外,9i的设置事件的方式可以是针对系统全部的,也可以是对会话的(即将该会话造成的脏缓冲回写)。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12361284/viewspace-488/
,如需转载,请注明出处,否则将追究法律责任。