您所在的位置:读书频道 > 数据库 > Oracle > 2.2 数据库高速缓冲区
《Oracle管理之道》第2章Oracle实例,本章重点在于深入解析Oracle本身运行时的内存空间,也就是Oracle的实例主体,但诚如本章开宗明义所说的,Oracle实例的成立并不代表用户或应用程序用户就能顺利使用Oracle数据库,还必须加上其他的程序,如程序全局区、用户全局区域与其他程序等,以后的章节将一一对其进行深入探讨。本节为大家介绍数据库高速缓冲区。
AD:
2.2 数据库高速缓冲区
Oracle有一个很重要的概念,就是除非到了必要的时候,否则不会等待磁盘I/O,因为磁盘I/O是计算机系统运行中最慢的一个部分,所以,所执行的I/O越少越好,在Oracle的数据库架构设计中,这种概念无所不在,数据库高速缓冲区(Database Buffer Cache)即是应此概念而规划出来的,其基础概念如下。
数据库高速缓冲区的主要功能是用来暂时存放最近读取自数据库中的数据,也就是数据文件(Data File)内的数据,而数据文件是以数据块(Block)为单位,因此,数据库高速缓冲区中的大小是以块为基数。当用户通过应用程序第一次向Oracle数据库发出查询请求时,Oracle会先在数据库高速缓冲区内寻找该数据,如果有该请求所需要的数据,就直接从数据库高速缓冲区传回给用户,这称为缓存命中(Cache Hit),这样就可以减少硬盘上的I/O次数。如果Oracle发现用户要的数据并不在数据库高速缓冲区里,就称为缓存失误(Cache Miss),Oracle会从数据库中读取所需要的数据块,先放入数据库高速缓冲区中,再传送给用户,如图2-22所示。
有关数据库高速缓冲区命中率的计算方式如下:
- SELECT 1 - (phy.value / (cur.value + con.value)) "CACHE HIT RATIO"
- FROMv$sysstat cur, v$sysstat con, v$sysstat phy
- WHERE cur.name = 'db block gets'
- AND con.name = 'consistent gets'
- AND phy.name = 'physical reads';
图2-22 数据库高速缓冲区 |
db block gets:是指DML指令所得到的数据块个数。
consistent gets:是指查询指令得到的数据块个数。
logical reads:将db block gets与consistent gets相加得到的数据块个数。
physical reads:实际从硬盘中读出的数据。
提示
数据库高速缓冲区命中率的公式是CACHE HIT RATIO = 1- (physical reads/(db block gets + consistent gets))。
利用以上的查询获取缓存命中率(HIT RATIO)最好要大于90%。
以上的查询命中率以整个数据库高速缓冲区为主。
数据库高速缓冲区中包含三种不同性质的缓存:
Dirty Buffer:这里的Buffer中存放的是已修改,但尚未写入数据库的数据。
Free Buffer:这里的Buffer是指其中的内容和数据库内的内容是一模一样的,也就是这些Buffer已经写入数据库内,随时可以拿来覆盖重复使用。
Pinned Buffer:这里的Buffer是指正在被使用的Buffer。
数据库高速缓冲区是利用两种List来管理内部三种不同性质的Buffer:
Dirty List:包含Dirty Buffer,主要是将准备写入数据库的数据,在适当的时机写入。
LRU List:包含Free Buffer、Dirty Buffer、Pinned Buffers。
Oracle对于数据库高速缓冲区的使用方式是利用后台进程的DBWRn写入数据文件内,而DBWRn将Dirty Buffer从数据库高速缓冲区取出再写到数据文件内,主要是通过两种方式:先期写入协议机制和LRU机制。
关于数据库高速缓冲区的基本概念及其运行方式,请参考作者另一本著作《Oracle 数据库管理与维护》,在此就不多作赘述。