当进程在辅助LRU链表和主LRU链表上扫描以查找可以覆盖的buffer header(空闲缓冲区)时,如果已经扫描的buffer header的数量到达一定的限度(由隐藏参数:_db_block_max_scan_pct决定)时,触发DBWR进程。 _db_block_max_scan_pct表示已经扫描的buffer header的个数占整个LRU链表上buffer header总数的百分比。通过DBWR保证拥有空闲缓冲区为止,这时,搜索可用buffer header的进程挂起,在v$session_wait中表现为等待“free buffer wait”事件,同时增加v$sysstat中的“dirty buffers inspected”和“DBWR make free requests”的值。
引用
NAME VALUE PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_block_max_scan_pct 40 Percentage of buffers to inspect when looking for free
引用
SQL> select KVITVAL,KVITTAG,KVITDSC from x$kvit
2 where KVITTAG='kcbfsp';
KVITVAL KVITTAG KVITDSC
---------- ----------------------------------- ----------------------------------------------------------------
40 kcbfsp Max percentage of LRU list foreground can scan for free
SQL> col VALUE for 999999999999
SQL> select * from v$sysstat
2 where name like '%dirty buffers inspected%';
STATISTIC# NAME CLASS VALUE
---------- --------------------------------------------- ---------- ----------------------
76 dirty buffers inspected 8 0
引用
NAME VALUE PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_writer_scan_depth_pct 25 Percentage of LRU buffers for dbwr to scan when looking for dirty
引用
SQL> select name,value from v$sysstat where name='DBWR lru scans';
NAME VALUE
---------------------------------------------------------------- ----------
DBWR lru scans 0
SQL> select name,value from v$sysstat where name='DBWR buffers scanned';
NAME VALUE
---------------------------------------------------------------- ----------
DBWR buffers scanned 0
如果主LRUW链表和辅助LRUW链表上的脏数据块的总数超过一定限度,也将触发DBWR进程。该限度由隐藏参数:_db_large_dirty_queue决定。
引用
NAME VALUE PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_large_dirty_queue 25 Number of buffers which force dirty queue to be written
SQL> col KVITTAG for a35
SQL> set linesize 300
SQL> select KVITVAL,KVITTAG,KVITDSC from x$kvit
2 where KVITTAG='kcbldq';
KVITVAL KVITTAG KVITDSC
---------- ----------------------------------- ----------------------------------------------------------------
25 kcbldq large dirty queue if kcbclw reaches this
每隔10秒钟唤醒一次DBWR,由隐含参数_dbwr_scan_interval决定,在9i中该值为10s,在10g中该值调整为300s。
引用
NAME VALUE PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_dbwr_scan_interval 10 dbwriter scan interval
另外要检索LRU和LRUW列,必须获得cache buffer lru chains锁存器,因此当并发进程检索LRU和LRUW列时,将引起latch:cache buffer lru chains等待事件。查看cache buffer lru chains锁存器由隐含参数_db_block_lru_latches或者可以用v$latch_children视图
引用
NAME VALUE PDESC
--------------------------------------------- -------------------- --------------------------------------------------
_db_block_lru_latches 16 number of lru latches
SQL> select count(*) from v$latch_children where name='cache buffers lru chain';
COUNT(*)
----------
16
Oracle 有多种缓冲池(buffer pool),各缓冲池分别使用这些锁存器:
引用
SQL> select d.blk_size,c.child#,p.bp_name,c.gets,c.sleeps
2 from x$kcbwds d,v$latch_children c,x$kcbwbpd p
3 where d.set_latch=c.addr
4 and d.set_id between p.bp_lo_sid and p.bp_hi_sid
5 order by c.child#;