Oracle 学习之--Buffer Cache深入解析

Oracle 学习之--Buffer Cache深入解析

Oracle 学习之--Buffer Cache深入解析

服务器进程和数据库缓冲区高速缓存:

  当服务器需要块时,需要按系列步骤读取块:

1、首先,服务器使用散列函数检查是否可以从缓冲区高速缓存中获得所需要的块。如果找到缓冲区,则将它移动到LRU列表中远离LRU末尾的另一端。这是逻辑读取,因为没有发生实际的I/O。如果在缓冲区高速缓存中找不到缓冲区,则服务器进程(Server)必须从数据文件中读取。


2、对数据文件进行读取之前,服务器进程将搜索LRU列表,以获得空闲的缓冲区。所有被服务器进程修改的缓冲区都放在检查点队列中。以便在检查点期间写出到磁盘。

3、如果检查点的大小超出了其阈值,服务器会发出信号通知DBWn刷新数据缓冲区高速缓存中的脏数据缓冲区。如果服务器在搜索阈值内找不到空闲的缓冲区,将发出信号通知DBWn进行刷新。

4、找到空闲缓冲区后,服务器将块从数据文件中读入到数据库缓冲区高速缓存中过的空闲缓冲区。Oracle服务器进程把缓冲区移动到LRU列表中远离LRU末尾的位置。

5、如果对块的读取不一致,服务器会由当前块和回滚段重建块的早期版本。

Oracle 学习之--Buffer Cache深入解析

DBWn进程和数据库缓冲区高速缓存:

DBWn将脏数据块写入数据文件,以确保服务器有空闲块,并以此来管理缓冲区高速缓存。DBWn响应实例中不同的事件:

1、Checkpoint Queue Exceeds Threshold:如果服务器进程发现检查点队列的大小超出其阈值,就会发出信号通知DBWn进行刷新。DBWn则将检查点队列中的缓冲区全部写出。

当检查点队列25%满就会触发DBWn的写操作:

SQL> desc x$kvit         

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 ADDR                                              RAW(8)

 INDX                                              NUMBER

 INST_ID                                            NUMBER

 KVITVAL                                            NUMBER

 KVITTAG                                            VARCHAR2(64)

 KVITDSC                                            VARCHAR2(64)

SQL> col KVITTAG for a20

SQL> col KVITDSC for a50

SQL> set linesize 120

SQL> select KVITTAG,KVITVAL,KVITDSC,INST_ID from x$kvit where KVITTAG='kcbldq';

KVITTAG                KVITVAL KVITDSC                                              INST_ID

-------------------- ---------- -------------------------------------------------- ------

kcbldq                      25 large dirty queue if kcbclw reaches this            1

 

相关推荐