Oracle 检查点队列和HASH Bucket

作为磁盘数据块的缓存,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的参数值;

发布了434 篇原创文章 · 获赞 512 · 访问量 294万+

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/104079503