Buffer cache chain latch

1 ORACLE逻辑读过程

1 进程根据需要访问的数据块文件号以及块号进行hash运算,结果为X,则定位bucket X

2 搜索bucket后面的链表,查找目标BH。

3 找到目标BH从BH中获取buffer的ba值。

4 按照ba访问buffer

2 Buffer cache chain latch

2.1 模式选择

在数据块查询过程中CBC latch以share的模式占用cbc,持有到读取到BUFFER BLOCK不修改buffer pin锁的状态。但是CBC latch的持有时间加长,在大量读取操作的环境可以有效降低竞争。索引根块和枝块基本都是读取操作。

对于索引:除了普通索引的根块和枝块,在唯一索引和索引唯一扫描时索引的根块,枝块还有叶块、表块都将以共享cbc LATCH方式保护。

 

1 当索引为唯一索引且谓词条件为id=则索引根,枝,叶、表块均为share模式获取cbc

2 当索引为唯一索引且谓词条件为id<>则只有根,枝为share,叶和表块为独享模式。

3 TABLE ACCESS BY USER ROWID ROWID方式直接逻辑读取表块也是独占模式)

 

2.2 产生原因

多个进程频繁地以不兼容模式申请申请某一CBC latch。

1 低效sql语句。

2 频繁执行的sql

主要包括两种模式,1 热链 2 热块,

处理CBC 查询热点对象的sql语句如下:

set lines 120

col owner for a10

col object_name for a30

col object_type for a10

select  owner, object_name, object_type,file#, dbablk

  from x$bh a, dba_objects b, v$session c

 where a.hladdr = c.P1RAW

   and b.DATA_OBJECT_ID = a.obj

   and c.event like '%latch: cache buffers chains%' order by object_type;

 

2.2.1 模拟热链

 

-----p1raw为编号

select dbms_rowid.rowid_relative_fno(rowid) fno,dbms_rowid.rowid_block_number(rowid) from system.dump01 where rownum=1

#######查询保护此数据块的cbc latch地址####

select hladdr from x$bh where file#=12 and dbablk=131

#######查询此latch所保护的所有对象以及数据块#############

select file#,dbablk,owner,object_name from x$bh a,dba_objects b where hladdr='000000006384CBF8' and a.obj=b.data_object_id

9       29455       SYS   SOURCE$

12     131  SYSTEM    DUMP01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值