文章转自:http://m.bianceng.cn/database/Oracle/201407/42884.htm

测试环境:版本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

【转】Cache Buffer Chain 第二篇的更多相关文章

  1. 【转】cache buffer chain 第一篇

    文章转自:http://www.jydba.net/cache-buffer-chain/ buffer cache的管理有两个重要的数据结构: hash bucket和cache buffer ch ...

  2. 【原】Cache Buffer Chain 第四篇

    作者:david_zhang@sh [转载时请以超链接形式标明文章] 链接:http://www.cnblogs.com/david-zhang-index/p/3873357.html [测试1]低 ...

  3. 【转】Cache Buffer Chain 第三篇

    文章转自:http://oracle.chinaitlab.com/induction/862509.html,文章前部分转载,后部分自己加上的. Oracle数据库只读模式的CACHE BUFFER ...

  4. [转帖]虚拟内存探究 -- 第二篇:Python 字节

    虚拟内存探究 -- 第二篇:Python 字节 http://blog.coderhuo.tech/2017/10/15/Virtual_Memory_python_bytes/ 是真看不懂哦     ...

  5. 【OpenGL】第二篇 Hello OpenGL

    ---------------------------------------------------------------------------------------------------- ...

  6. lnux内核的malloc实现(Oracle的cache buffer影子)

    lnux内核的malloc实现(Oracle的cache buffer影子) 本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/artic ...

  7. Python人工智能第二篇

    Python人工智能之路 - 第二篇 : 现成的技术   预备资料: 1.FFmpeg: 链接:https://pan.baidu.com/s/1jonSAa_TG2XuaJEy3iTmHg 密码:w ...

  8. ElasticSearch入门 第二篇:集群配置

    这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  9. SDWebImage源码阅读-第二篇

    一  SDWebImageManager的downloadImageWithURL的方法 上一篇,我们刚开了个头,分析了一下开始加载图片之前如何取消其他正在下载的任务,接着,我们回到 - (void) ...

随机推荐

  1. python 大小写转换方法(全)

    http://blog.csdn.net/liuxincumt/article/details/7945337  python大小写转换(全)

  2. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功         登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...

  3. selector的button选中处理问题

    1.背景介绍 在做Android项目开发的时候,有时我们须要对button做一些特殊的处理,比方button点击的时候会有一个动画的效果,实际上就是几张图片在短时间的切换.再比方有时候我们须要对界面的 ...

  4. 【每日Scrum】第二天(4.23) TD学生助手Sprint2站立会议

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 昨天觉得整个界面不适合后期功能扩展,所以进行了整体整改 今天主要看了多事件处理的内容然后改了下界面, 遇到的困难就是正在寻找用户交互性比较好的 ...

  5. [转]eclipse查看某个java类属于哪个jar包

    原文地址:https://blog.csdn.net/csdnliuxin123524/article/details/73572836 在eclipse界面直接按ctrl+shift+t,弹出以下界 ...

  6. 前端-DDoS攻击

    下面的脚本(略有修改)就会向受害网站发送大量的请求: function imgflood() { var TARGET = 'example.com' var URI = '/index.php?' ...

  7. 基于struts2的学生报道管理系统(附github源码地址)

    本项目参考了<java web轻量级开发全体验>,加入了对mysql的支持. 一.基本业务功能 通过struts2框架,结合mysql数据库构建一个学生报到管理系统,来模拟学生报到登记的过 ...

  8. parameters arguments 形式参数 实际参数

    parameter和argument的区别 – 笑遍世界 http://smilejay.com/2011/11/parameter_argument/ https://en.wikipedia.or ...

  9. mybatis入门--主键返回(九)

    自增主键返回 mysql自增主键,执行insert提交之前自动生成一个自增主键. 通过mysql函数获取到刚插入记录的自增主键: LAST_INSERT_ID() 是insert之后调用此函数. 修改 ...

  10. DuiLib笔记之CDuiString的bug

    在C/C++中,当使用==比较两个对象时,推荐的风格是将常量置前 例如 if (0 == variable) { ... } 但在DuiLib中,CDuiString存在一个bug:在用==进行比较时 ...