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的参数值;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值