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