楼主: guoyJoe

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

[复制链接]
论坛徽章:
58
生肖徽章2007版:马
日期:2009-11-06 23:12:33授权会员
日期:2013-01-10 14:38:592013年新春福章
日期:2013-02-25 14:51:24马自达
日期:2013-08-07 10:54:45红旗
日期:2013-08-09 13:48:48劳斯莱斯
日期:2013-09-12 15:56:37萤石
日期:2013-10-31 08:44:19优秀写手
日期:2013-12-18 09:29:13Jeep
日期:2014-01-14 10:53:432014年新春福章
日期:2014-02-18 16:43:09
21#
发表于 2013-2-19 10:18 | 只看该作者
guoyJoe 发表于 2013-2-19 10:14
阳大新年好,回上海了没?

回了  早晨上班 正逢大雪!

使用道具 举报

回复
论坛徽章:
70
夏利
日期:2013-09-29 21:02:15天蝎座
日期:2016-03-08 22:25:51嫦娥
日期:2014-03-04 16:46:45ITPUB年度最佳技术原创精华奖
日期:2014-03-04 16:19:29马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:11
22#
发表于 2013-2-19 11:39 | 只看该作者
郭大师不如再深入一步,为大家测试下,如果手动将buffer Header中Buffer Pin内存位设置为1,这就等同于加上了共享Buffer Pin锁,这时另开一个会话,更新这个块,会有什么情况呢

使用道具 举报

回复
论坛徽章:
41
紫蛋头
日期:2012-11-12 14:45:312014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-03-03 14:29:41马上有车
日期:2014-03-20 17:48:31马上加薪
日期:2014-03-28 15:18:022014年世界杯参赛球队: 厄瓜多尔
日期:2014-06-25 18:57:33马上有车
日期:2014-07-29 18:27:14马上有车
日期:2014-08-19 14:32:59itpub13周年纪念徽章
日期:2014-10-08 15:16:50
23#
发表于 2013-2-19 15:41 | 只看该作者
支持,期待更多的好文啊,郭大师

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
24#
 楼主| 发表于 2013-2-20 10:33 | 只看该作者
vage 发表于 2013-2-19 11:39
郭大师不如再深入一步,为大家测试下,如果手动将buffer Header中Buffer Pin内存位设置为1,这就等同于加上 ...

这个情况估计做update操作不会有等待,会有CR块产生,我马上做个实验来验证一下.

使用道具 举报

回复
论坛徽章:
24
复活蛋
日期:2012-11-06 10:25:40三菱
日期:2013-12-09 16:01:14日产
日期:2013-12-18 10:21:132014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31马上有房
日期:2014-05-07 14:46:24青年奥林匹克运动会-铁人三项
日期:2014-09-04 09:53:20喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47路虎
日期:2013-11-29 09:18:29
25#
发表于 2013-2-20 11:03 | 只看该作者
mark

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
26#
 楼主| 发表于 2013-2-20 13:17 | 只看该作者
本帖最后由 guoyJoe 于 2013-2-20 13:29 编辑
vage 发表于 2013-2-19 11:39
郭大师不如再深入一步,为大家测试下,如果手动将buffer Header中Buffer Pin内存位设置为1,这就等同于加上 ...

为大家测试下,如果手动将buffer Header中Buffer Pin内存位设置为1,这就等同于加上了共享Buffer Pin锁,这时另开一个会话,更新这个块,会有什么情况呢?

1.取T1表的第一行数据做测试:
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
------------------ ---------- ---------- ----------   --------------
AAASP9AAGAAAACDAAA          6        131        468   gyj468

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

2.根据文件号块号获取CBC Latch的地址
SQL> select hladdr,ba,decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') status from x$bh where file#=6 and dbablk=131;

HLADDR           BA               STATUS
---------------- ---------------- -------
00000003A43FA468 000000039459C000 xcur    --BA=000000039459C000时这个块的状态是xcur(当前块)从上面可以看出6号文件131号块的状态是当前块

3.查本会话下的会话号,进程号
SQL> select s.sid,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);

  SID SPID
---------- ------------------------
       125 1545
从上面看出会话号125,进程号1545

4.用Dtrace跟踪一下找到buffer pin的地址3947e73d0
1  51768        sskgslcas:entry i=23 PID::entry:==pid1545:oracle:sskgslcas:entry 3947e73d0 0 1 0 3947e
  如何查到buffer pin地址查看这个链接:http://www.itpub.net/thread-1764511-2-3.html
  
4.另开一个会话利用oradebug工具
SQL> conn / as sysdba
Connected.
SQL> select distinct sid from v$mystat;

       SID
----------
        16 
SQL> oradebug peek 0x3947e73d0 4       --查6号文件131号有没有buffer pin
BEFORE: [3947E73D0, 3947E73D4) = 00000000   --从这个值上看在6号文件131号块上没有加buffer pin
SQL> oradebug poke 0x3947e73d0 4 1      --在6号文件131号加buffer pin
BEFORE: [3947E73D0, 3947E73D4) = 00000000
AFTER:  [3947E73D0, 3947E73D4) = 00000001   --由0变成1,说明已加上了buffer pin

5.再回到125号会话下,查6号文件131号块的数据
SQL> select * from gyj.t1 where rowid='AAASP9AAGAAAACDAAA';

        ID  NAME

---------- -----------------------------
       468  gyj468

SQL> select hladdr,ba,decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') status from x$bh where file#=6 and dbablk=131;

HLADDR           BA               STATUS
---------------- ---------------- -------
00000003A43FA468 000000039459C000 xcur    --BA=000000039459C000时这个块的状态是xcur(当前块)

6.再开一个新会话,对6号文件131号块的rowid='AAASP9AAGAAAACDAAA'的这行数据做update,把name的值由gyj468修改成gyjdba;
SQL> update gyj.t1 set name='gyjdba' where rowid='AAASP9AAGAAAACDAAA';

1 row updated.
update操作没有发生待等

7.再查6号文件131号块,有两条记录,多产生了一条状态是CR的记录
SQL> select hladdr,ba,decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi',9,'memory',10,'mwrite',11,'donated') status from x$bh where file#=6 and dbablk=131;
HLADDR           BA               STATUS
---------------- ---------------- -------
00000003A43FA468 000000038F442000 xcur    --从BA这个字段可以看出这是新产生出来的,就是后面的UPDATE操作,xcur当前块
00000003A43FA468 000000039459C000 cr      --BA=000000039459C000可以看出这是原来做SELECT的操作,由状态xcur(当前块)变成cr(一致性读块)

8.查等待事件
SQL> select sid,event from v$session where wait_class<>'Idle';

       SID EVENT
---------- ----------------------------------------------------------------
       140 SQL*Net message to client
没有发生等待

总结一下:在这种情况下读是不会阻塞写的,那我们在AWR中看到的buffer busy waits等待事件是由什么产生的,它是由写(DML/DDL)阻塞读(SELECT),写阻塞写产生的.
吕大师我有个疑问:那读会阻塞写吗?如果有那么在哪几种情况发生,对了在AWR中看到的dirty buffers inspected等待事件跟读阻塞写有关吗?







使用道具 举报

回复
论坛徽章:
4
2013年新春福章
日期:2013-02-25 14:51:24技术图书徽章
日期:2014-01-24 09:42:212014年新春福章
日期:2014-02-18 16:48:49马上加薪
日期:2014-02-18 16:48:49
27#
发表于 2013-2-20 13:25 | 只看该作者
都是大师阿,太强了

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
28#
 楼主| 发表于 2013-2-20 13:27 | 只看该作者
wenzhou320 发表于 2013-2-20 13:25
都是大师阿,太强了

共同学习共同进步!

使用道具 举报

回复
论坛徽章:
2
2013年新春福章
日期:2013-02-25 14:51:24懒羊羊
日期:2015-03-28 12:52:25
29#
发表于 2013-2-20 14:34 | 只看该作者
guoyJoe 发表于 2013-2-20 13:17
为大家测试下,如果手动将buffer Header中Buffer Pin内存位设置为1,这就等同于加上了共享Buffer Pin锁, ...

这个位置是加shared pin么?
我想是否先在这个位置加execlusive pin,模拟出buffer busy wait,确认这个位置确实是用来控制pin的

使用道具 举报

回复
论坛徽章:
490
红宝石
日期:2014-04-05 19:53:18海蓝宝石
日期:2014-04-05 21:24:30数据库板块每日发贴之星
日期:2013-05-27 22:53:45生肖徽章:鸡
日期:2014-08-24 18:39:29青年奥林匹克运动会-羽毛球
日期:2014-09-24 08:37:59马上有房
日期:2015-01-03 10:23:28喜羊羊
日期:2015-03-04 14:54:422015年新春福章
日期:2015-03-06 11:59:47秀才
日期:2017-04-06 18:09:28版主6段
日期:2014-05-27 02:19:57
30#
 楼主| 发表于 2013-2-20 14:37 | 只看该作者
本帖最后由 guoyJoe 于 2013-2-20 14:38 编辑
mike79 发表于 2013-2-20 14:34
这个位置是加shared pin么?
我想是否先在这个位置加execlusive pin,模拟出buffer busy wait,确认这个 ...

做select的时候就是shared pin,这个位置确定是控制pin的
做dml/ddl操作才有:execlusive pin

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表