X$KVIT的含义为:
[k]ernel Layer Performance Layer[v][I]nformation tables [T]ransitory Instance parameter
SQL> select kvittag,kvitval,kvitdsc from x$kvit;
KVITTAG KVITVAL KVITDSC
-------------------- ------- --------------------------------------------------
ksbcpu 2 number of logical CPUs in the system used by Oracle
ksbcpucore 2 number of physical CPU cores in the system used by Oracle
ksbcpusocket 1 number of physical CPU sockets in the system used by Oracle
ksbcpu_hwm 2 high water mark of number of CPUs used by Oracle
ksbcpucore_hwm 2 high water mark of number of CPU cores on system
ksbcpusocket_hwm 1 high water mark of number of CPU sockets on system
ksbcpu_actual 2 number of available CPUs in the system
ksbcpu_dr 1 CPU dynamic reconfiguration supported
kcbnbh 34860 number of buffers
kcbldq 25 large dirty queue if kcbclw reaches this
kcbfsp 40 Max percentage of LRU list foreground can scan for free
kcbcln 2 Initial percentage of LRU list to keep clean
kcbnbf 750 number buffer objects
kcbwst 0 Flag that indicates recovery or db suspension
kcteln 0 Error Log Number for thread open
kcvgcw 0 SGA: opcode for checkpoint cross-instance call
kcvgcw 0 SGA:opcode for pq checkpoint cross-instance call
⑴ 当一个Server进程需要读数据到Buffer Cache中时,首先必须判断该数据在Buffer中是否存在,如果存在且可用,则获取该数据,同时根据LRU算法增进其访问计数;如果Buffer中不存在该数据,则需要从数据文件上进行读取。
⑵ 在读取数据之前,Server进程需要扫描LRU List寻找Free的Buffer,扫描过程中Server进程会把发现的所有已经被修改过的Buffer注册到Dirty List上,这些Dirty Buffer随后可以被写出到数据文件。
⑶ 如果Dirty Queue超过了阀值,Server进程就会通知DBWn去写出脏数据。
这也是触发DBWn写的一个条件,这个阀值曾经提到是25%,也就是当Dirty Queue超过25%满就会触发DBWn的写操作:
SQL> select kvittag,kvitval,kvitdsc from x$kvit where kvittag='kcbldq';
KVITTAG KVITVAL KVITDSC
-------------------- ------- --------------------------------------------------
kcbldq 25 large dirty queue if kcbclw reaches this
如果Server进程扫描LRU超过一个阀值仍然不能找到足够的Free Buffer,将停止寻找,转而通知DBWn去写出脏数据,释放内存空间。
同样这个阀值可以从以上字典表中查询得到,这个数字是40%,也就是说当Server进程扫描LRU超过40%还没能找到足够的Free Buffer就会停止搜索,通知DBWn执行写出,这时进程会处于free buffer wait等待:
SQL> select kvittag,kvitval,kvitdsc from x$kvit where kvittag='kcbfsp'
KVITTAG KVITVAL KVITDSC
-------------------- ------- --------------------------------------------------
kcbfsp 40 Max percentage of LRU list foreground can scan for free
同时我们知道,由于增量检查点的引入,DBWn也会主动扫描LRU List,将发现的Dirty Buffer 注册到Dirty List以及Checkpoint Queue,这个扫描也受一个内部约束,在Oracle9iR2中,这个比例是25%。
⑷ 找到足够足够的Buffer之后,Server进程就可以将Buffer从数据文件读入Buffer Cache。
⑸ 如果读取的Block不满足读一致性需求,则Server进程需要通过当前Block版本和回滚段构造前镜像返回给用户。
从Oracle8i开始,LRU List和Dirty List又分别增加了辅助List(AUXILIARY List),用于提高管理效率。引入了辅助List之后,当数据库初始化时,Buffer首先存放在LRU的辅助List(AUXILIARY RPL_LST),当被使用后移动到LRU的主List上(MAIN RPL_LIST),这样当用户进程搜索Free Buffer时就可以从LRU-AUX List开始,而DBWR搜索Dirty Buffer时,则可以从LRU-Main List开始,从而提高了搜索效率和数据库性能。
阅读(1875) | 评论(0) | 转发(0) |