逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析

测试环境:版本11gR2
SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

一、逻辑读的过程
 1、Oracle以每个块的文件号、块号和类型做HASH运算,得到HASH值。根据HASH值,到HASH表中取出指定块的内存地址
 2、获取CBC Latch(实验的重点测试部分)
 3、根据HASH值,搜索CBC链表
 4、根据DBA找到BH(Buffer Header)加Buffer Pin
 5、加完Buffer Pin马上释放CBC Latch
 6、访问Buffer开始fetch数据
 7、获取CBC Latch
 8、释放Buffer Pin
 9、释放CBC Latch

二、取T1表的第一行数据及ROWID,根据dbms_rowid包查出这行数据的文件号、块号
SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,id,name from gyj.t1 where rownum=1;

ROWID                   FILE#     BLOCK#         ID NAME
------------------ ---------- ---------- ---------- ----------
AAASP9AAGAAAACHAAA          6       135          1 aaaaa

这里的DBA(Data Block Address)就是由6号文件和135号块组成

三、根据文件号块号获取CBC Latch的地址
SQL> select hladdr from x$bh where file#=6 and dbablk=135;
HLADDR
----------------
00000003A4282A90

四、根据CBC Latch的地址可以查出这个CBC Latch被获得的次数
1.获取CBC Latch的次数为245
SQL> select addr,name,gets from v$latch_children  where addr='00000003A4282A90';
ADDR             NAME                                                                   GETS
---------------- ---------------------------------------------------------------- ----------
00000003B09F7C58 cache buffers chains                                                    245

2.再次读取T1表的第一数据,即产生一次逻辑读
SQL>select id,name from gyj.t1 where rowid='AAASP9AAGAAAACHAAA';
  ID      NAME
  -------- ------------
1     gyj1

3.CBC Latch的次数变为247,说明一次逻辑读产生两次CBC Latch
SQL> select addr,name,gets from v$latch_children  where addr='00000003A4282A90';
ADDR             NAME                                                                   GETS
---------------- ---------------------------------------------------------------- ----------
00000003A4282A90 cache buffers chains                                                    247

五、查本会话下的进程号
SQL> select spid from v$session s,v$process b where s.paddr=b.addr and s.sid in(select sid from v$mystat where rownum=1);

SPID
------------------------
2416

六、利用Dtrace工具跟踪
1.编写个简单的dtrace脚本
vi dtrace.d

#!/usr/sbin/dtrace -s -n
dtrace:::BEGIN
{
       i=1;
}

pid$1:::entry
{
       printf("i=%d PID::entry:==%s:%s:%s:%s %x %x %x %d %x %x",i, probeprov, probemod, probefunc, probename,arg0,arg1,arg2,arg3,arg4,arg5);
       i=i+1;
}

2.授权限
chmod 755 dtrace.d

3.执行dtrace命令生成跟踪日志
./dtrace.d -x switchrate=1hz -b 32m 2416 > dtracecbc.log --用这条命令加大了缓存,避免丢失日志

4.显示主要dtrace部分日志,在dtracecbc.log中搜索latch地址:3A4282A90

 CPU     ID                    FUNCTION:NAME
 --逻辑读开始
 1  63919                    kcbgtcr:entry i=592 PID::entry:==pid2416:oracle:kcbgtcr:entry fffffd7ffc98bc00 0 2fe 0 23dede0 fffffd7fffdfa7a0
 --获取CBC Latch
 1 128720                  sskgslcas:entry i=593 PID::entry:==pid2416:oracle:sskgslcas:entry 3a4282a90 0 1 0 0 3a4c953d0          
 1  60714                     ktrexf:entry i=594 PID::entry:==pid2416:oracle:ktrexf:entry fffffd7fffdfa7a0 d7fcd60 0 15392235540 1fe8 23dc9f0
 1  64185                     kcbzgs:entry i=595 PID::entry:==pid2416:oracle:kcbzgs:entry 1 d7fcd60 0 0 0 23dc9f0
 1  53939           kssadf_numa_intl:entry i=596 PID::entry:==pid2416:oracle:kssadf_numa_intl:entry 23 3a4145900 3a487d9e8 0 0 1d
 --根据DBA找到BH(Buffer Header)加Buffer Pin
 1 128720                  sskgslcas:entry i=597 PID::entry:==pid2416:oracle:sskgslcas:entry 3957f6280 0 1 0 3957f6238 3957f6238
 --加完Buffer Pin马上释放CBC Latch
 1 128723                 sskgsldecr:entry i=598 PID::entry:==pid2416:oracle:sskgsldecr:entry 3a4282a90 1 1 0 1 2000000000000000          
 1  63951                     kcbcge:entry i=599 PID::entry:==pid2416:oracle:kcbcge:entry fffffd7ffc98bc00 0 77 0 fffffd7ffc98b7dc 0
 1  64116                  kcbds2pbh:entry i=600 PID::entry:==pid2416:oracle:kcbds2pbh:entry fffffd7ffc98bc00 0 77 0 fffffd7ffc98b7dc 0
 1  60179                     ktcckv:entry i=601 PID::entry:==pid2416:oracle:ktcckv:entry fffffd7ffc98bc00 fffffd7ffc98b7d4 77 0 3a3c935f0 0
 1 104774                     kafger:entry i=602 PID::entry:==pid2416:oracle:kafger:entry 39572e064 fffffd7fffdfb200 39d84e4f0 2 1 1
 1  83919                     kpofcr:entry i=603 PID::entry:==pid2416:oracle:kpofcr:entry fffffd7fffdfb4b0 1 39d84e4f0 2 4c30d40 3a4fd3790
 1 124023                     ttcrxh:entry i=604 PID::entry:==pid2416:oracle:ttcrxh:entry d8055e8 d7f58f0 fffffd7fffdfafe0 48 214 1
 1 209006                     memcpy:entry i=605 PID::entry:==pid2416:libc.so.1:memcpy:entry ddfa329 fffffd7fffdfafe0 30 48 ddfa359 d7f5a00
 1 209006                     memcpy:entry i=606 PID::entry:==pid2416:libc.so.1:memcpy:entry ddfa35b 39572fff5 2 2 2 d7f5a00
 1 123964                     ttcc2u:entry i=607 PID::entry:==pid2416:oracle:ttcc2u:entry d8055e8 d7f58f0 39572fff8 4 1 1
 1 209006                     memcpy:entry i=608 PID::entry:==pid2416:libc.so.1:memcpy:entry ddfa35e 39572fff8 4 852 d7f5a00 d7f5a00
 1  61112            ktsmg_max_query:entry i=609 PID::entry:==pid2416:oracle:ktsmg_max_query:entry 0 0 39572fffc 0 d805250 2
 1 211309                  gethrtime:entry i=610 PID::entry:==pid2416:libc.so.1:gethrtime:entry 92d 1a 39572fffc 8 3a4447d80 39de97dc8
 1 128314                    slcpums:entry i=611 PID::entry:==pid2416:oracle:slcpums:entry d805218 1a 494b3f016 8 3a443a460 39c253698
 1 211401                      times:entry i=612 PID::entry:==pid2416:libc.so.1:times:entry fffffd7fffdfb240 1a 494b3f016 8 3a443a460 39c253698
 1 131260     kglHandleInvalidations:entry i=613 PID::entry:==pid2416:oracle:kglHandleInvalidations:entry d8055e8 39df04bb0 0 8 d7f1a10 39c2d1140
 1 131261             kglHandleLoads:entry i=614 PID::entry:==pid2416:oracle:kglHandleLoads:entry d8055e8 39df04bb0 0 8 d7f1a10 39c2d1140
 1  91756                kksGetStats:entry i=615 PID::entry:==pid2416:oracle:kksGetStats:entry 39d738198 39df04bb0 0 8 d7f1a10 39c2d1140
 1  72794            kews_sqlcol_end:entry i=616 PID::entry:==pid2416:oracle:kews_sqlcol_end:entry 3a4fd2210 fffffd7ffc9e1ad8 39d737e88 70 1 1
 1 110094                  qecrlssub:entry i=617 PID::entry:==pid2416:oracle:qecrlssub:entry 39d84ed10 fffffd7ffc9e1ad8 9 0 fffffd7ffc98ac58 0
 1 108487               qertbRelease:entry i=618 PID::entry:==pid2416:oracle:qertbRelease:entry 39d84dea8 fffffd7ffc98bae0 9 0 4c0 dbb56b0
 1 104779                     kafcpy:entry i=619 PID::entry:==pid2416:oracle:kafcpy:entry 39d84e4f0 2 9 0 fffffd7ffc987430 20
 --访问Buffer开始fetch数据
 1 209006                     memcpy:entry i=620 PID::entry:==pid2416:libc.so.1:memcpy:entry fffffd7ffc9f49f8 39572fff8 4 0 30 20              
 1 209006                     memcpy:entry i=621 PID::entry:==pid2416:libc.so.1:memcpy:entry fffffd7ffc9f49e0 39572fff5 2 1 30 20            
 1  63927                   kcbipnns:entry i=622 PID::entry:==pid2416:oracle:kcbipnns:entry fffffd7ffc98bc00 39572fff5 39572fff7 0 fffffd7ffc98bbe8 2c1

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-11-02 15:52:11

逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析的相关文章

[20150309]逻辑读产生CBC Latch的解析.txt

[20150309]逻辑读产生Cache Buffer Chain(简称CBC) Latch的解析.txt --参考链接http://blog.csdn.net/guoyjoe/article/details/8585391,自己也做1次. 逻辑读的过程 1.Oracle以每个块的文件号.块号和类型做HASH运算,得到HASH值.根据HASH值,到HASH表中取出指定块的内存地址 2.获取CBC Latch(实验的重点测试部分) 3.根据HASH值,搜索CBC链表 4.根据DBA找到BH(Buf

等待模拟-cache buffer chain

出现CACHE BUFFER CHAIN 后首先查看V$SESSION_WAIT 找到P1raw的值,此P1对应了v$latch_children addr和 x$bh 的HLADDR 然后查看v$latch_children 找到GET最高的LATCH ADDR  select * from v$latch_children where name='cache buffers chains' order by gets desc;  select * from v$latch_children

buffer cache实验5-latch:cache buffers chain

1.CBC latch产生的原理: 一次逻辑读时CBC latch锁及Buffer pin锁的获取和释放过程如下: 1.加Latch X 2.进入hash chain,在相应的BH上加Buffer pin S (0-->1) 3.释放Latch X 4.进行逻辑读--也就是通过BH中的buffer adderss找到数据块在内存中真实位置  ---假如读了1MS 5.加Latch X 6.释放Buffer pin S (1-->0)  0:没锁  1:共享锁  2:独占锁 7.释放Latch

CACHE BUFFER CHAINS

出现CACHE BUFFER CHAIN 后首先查看V$SESSION_WAIT 找到P1raw的值,此P1对应了v$latch_children addr和 x$bh 的HLADDR 然后查看v$latch_children 找到GET最高的LATCH ADDR  select * from v$latch_children where name='cache buffers chains' order by gets desc; 最后和X$BH连接找到对象 查看当前等待的,注意本语句只能查询

数据读取的逻辑读简单解析:关于BUFFER CACHE

数据读取之逻辑读简单解析--BUFFER CACHE   关于consistent read--一致性读--Logical read-逻辑读-current read当前读--物理读,详见:http://blog.csdn.net/haibusuanyun/article/details/11489091 一.实验数据准备--查出一条数据的ROWID,及FILE_ID,BLOCK_ID等信息 BYS@ bys3>select rowid,test.* from test where rownum

buffer cache实验9:从buffer caceh中读取数据块解析-从逻辑读到物理读

先来张大图: 所用SQL语句: BYS@ ocm1>select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,deptno from bys.test;     FILE#     BLOCK#     DEPTNO ---------- ---------- ----------         4        391         10 就以上图为例,文字描述

如何模拟产生CBC LATCH与buffer busy wait等待事件

数据库版本:Oracle 11.2.0.4.0 CBC latch出现的原因:   --只在逻辑读时产生 1.CBC latch保护不同的链表.不同BH   :同一LATCH下多个BUCKET被同时访问时,(一个LATCH对应多个BUCKET) 2.CBC latch保护同一链表下同一BH  :同一LATCH下同一BH被同时访问时 latch: cache buffers chains 解决方法: 1._db_block_hash_latches加大latch数量,作用是减少同一LATCH下多个

ORACLE 物理读 逻辑读 一致性读 当前模式读总结浅析

     在ORACLE数据库中有物理读(Physical Reads).逻辑读(Logical Reads).一致性读(Consistant Get).当前模式读(DB Block Gets)等诸多概念,如果不理解或混淆这些概念的话,对你深入理解一些知识无疑是一个障碍,但是这些概念确实挺让让人犯晕的.下面我们总结.学习一下这方面的知识点.捋一捋他们的关系和特点,希望对你有所帮助.   物理读(Physical Reads)   从磁盘读取数据块到内存的操作叫物理读,当SGA里的高速缓存(Cac

[20171115]关于逻辑读的疑问.txt

[20171115]关于逻辑读的疑问.txt --//有网友指出[20150209]为什么少1个逻辑读.txt,链接:http://blog.itpub.net/267265/viewspace-1430902/ --//如何验证是这样操作的. 1.环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----