作为磁盘数据块的缓存,Buffer Cache在Oracle的所有内存池中是最大的。
假设进程要访问5号数据文件中的第1234号块,Oracle如何知道这个块是否在Buffer Cache中?如果在,地址是多少?使用HASH算法;
在Oracle中,几乎所有在内存中搜索数据的算法都采用HASH算法。
HASH算法中有一个重要的概念:Bucket。
Buffer Cache中的HASH Bucket数量,由_db_block_hash_buckets参数设置。
Oracle HASH表的Bucket中存放的是指向链表头的指针。
Buffer Header,简称BH。
SGA中是公共内存,哪怕要访问公共内存中的一个字节,都需要有某种锁机制保护。
Oracle采用的锁机制是Latch和Mutex。
修改块时,Buffer中有用户最新修改的数据,这些数据还没有写入磁盘,这样的Buffer就是脏Buffer(脏块)。
脏块由DBWR进程统一写磁盘。
脏块链表有两个,检查点队列(CKPT-Q),LRUW。
当块变脏,Oracle会做两件事,一是生成Redo,二是将脏块链接到检查点队列。
select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT
from x$kcccp;
SELECT ksppinm, ksppstvl, ksppdesc
FROM x$ksppi x, x$ksppcv y
WHERE x.indx = y.indx
AND ksppinm = '_db_block_hash_buckets';
CPDRT列是检查点队列中的脏块数目;
CPODS列是on disk rba的scn ;
CPODT列是on disk rba的时间戳 ;
CPHBT列是心跳。
隐藏参数 (hidden parameters) ,由oracle内部使用,以 '_' 开头。
查看_db_block_hash_buckets的参数值;