什么是cache buffers chains latch
当用户执行一条select语句的过程如下:
1.根据记录找到对应的DBA:
比如:
SQL> select dbms_rowid.ROWID_BLOCK_NUMBER(rowid) as bk_num,dbms_rowid.ROWID_RELATIVE_FNO(rowid) as f_num from study.test where id = 99999999;
BK_NUM F_NUM
---------- ----------
9622 4
2.根据DBA做hash运算,算出所在的BUCKET
HASH(FILE#,BLOCK#) = hash_value(HV)
3.获取CBC latch,上个实验中我们等到,一个latch保护32个bucket
SQL> SELECT HLADDR,OBJ,STATE,BA,TCH FROM X$BH WHERE FILE#=4 AND DBABLK=9622;
HLADDR OBJ STATE BA TCH
---------------- ---------- ---------- ---------------- ----------
000000009DB80560 13744 1 00000000788D2000 1
SQL> select NAME v$latch_children from v$latch_children where ADDR ='000000009DB80560';
V$LATCH_CHILDREN
--------------------------------------------------------------------------------
cache buffers chains
000000009DB80560就是latch的内存地址
4. 在latch保护之下去搜BH链表
5.匹配到bh中的DBA,给bh加buffer pin( 0—>1共享锁),修改的话就是独占锁
6.释放cbc latch
7.从BH上读到BA.通过BA找到我们buffer cache 中所要的buffer块
8.获取cbc latch,释放buffer pin
9.释放cbc latch
我的理解是:cbc latch是为了保护buffer pin ,所以需要两次,而且一般都是加独占的锁,不然都是使用CBC latch来保护,竞争会非常大,latch需要从开始持有到结束。需要消耗cpu ,在读写频繁的情况下,会有很大的问题。
CBC LATCH出现的两种情况
1.热链
同一CBC LATCH下多个hash chain上的多个BH被同时访问时
2.热块
同一hash chain上同一BH被同时访问时
热链模拟实验:
实验环境:
create table study.cbc_latch
(
id varchar2(100),
id1 varchar2(100),
id2 varchar2(100),
id3 varchar2(100),
id4 varchar2(100),
id5 varchar2(100),
id6 varchar2(100),
id7 varchar2(100),
id8 varchar2(100),
id9 varchar2(100),
id10 varchar2(100),
id11 varchar2(100),
id12 varchar2(100),
id13 varchar2(100),
id14 varchar2(100),
id15 varchar2(100),
id16 varchar2(100),
id17 varchar2(100),
id18 varchar2(100),
id19 varchar2(100),
id20 varchar2(100)
);
begin
for i in 1 .. 1000000
loop
insert into study.cbc_latch
(
id ,
id1