ORACLE (5): buffer cache(CBC LATCH实验)

本文详细介绍了Oracle的CBC LATCH机制,包括缓存缓冲区链锁的作用,热链和热块的概念,以及如何通过实验模拟这两种情况。通过分析,指出CBC LATCH在读写频繁时可能导致的问题,并提出了优化建议,如增加latch数量、扩大缓存大小等。最终强调,优化SQL是解决此类问题的最佳策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值