1. 背景

cbc latch的竞争,读取模式下各个版本可能是不同的。

比如在版本11.2.0.4.0是模拟不出读取模式下latch: cache buffers chains,这里原因不做探讨。

2. 过程

关于cbc latch,我们知道逻辑读下,通过全表扫描或者rowid去读取块,用的是独占的cbc latch模式。

2.1 热块竞争

热块竞争下的cbc。

2.1.1 版本11.2.0.1.0

session 1和session 2同时执行。

  1. SYS@zkm> create table zkm.test as select rownum id from dual connect by rownum<=10;
  2. Table created.
  3. SYS@zkm> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,rowid from zkm.test where rownum=1;
  4. FILE# BLOCK# ROWID
  5. ---------- ---------- ------------------
  6. 4 131 AAAEQGAAEAAAACDAAA

2.1.1.1 session 1(sid:34)

  1. SYS@zkm> select sid from v$mystat where rownum=1;
  2. SID
  3. ----------
  4. 34
  5. SYS@zkm> declare
  6. 2 r int;
  7. 3 begin
  8. 4 for i in 1..1000000000 loop
  9. 5 select count(*) into r from zkm.test where rowid='AAAEQGAAEAAAACDAAA';
  10. 6 end loop;
  11. 7 end;
  12. 8 /
  13. ---等待

2.1.1.2 session 2(sid:35)

  1. SYS@zkm> select sid from v$mystat where rownum=1;
  2. SID
  3. ----------
  4. 35
  5. SYS@zkm> declare
  6. 2 r int;
  7. 3 begin
  8. 4 for i in 1..1000000000 loop
  9. 5 select count(*) into r from zkm.test where rowid='AAAEQGAAEAAAACDAAA';
  10. 6 end loop;
  11. 7 end;
  12. 8 /
  13. ---等待

2.1.1.3 session 3

查看等待事件。

下边结果是最终执行完后查询信息。

  1. SYS@zkm> select sid,event,TOTAL_WAITS from v$session_event where sid in (34,35);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 34 Disk file operations I/O 1
  5. 34 latch: cache buffers chains 176
  6. 34 cursor: pin S 1497
  7. 34 SQL*Net message to client 7
  8. 34 SQL*Net message from client 6
  9. 35 Disk file operations I/O 1
  10. 35 latch: cache buffers chains 236
  11. 35 cursor: pin S 1453
  12. 35 SQL*Net message to client 7
  13. 35 SQL*Net message from client 6
  14. 10 rows selected.

其中,“latch: cache buffers chains”中sid34和sid35各发生了176次和236次。

2.1.2 版本11.2.0.4.0

步骤类似2.1,省略其中2.1.1.1-2.1.1.2。

2.1.2.1 session 3

  1. SYS@zkm> select sid,event,TOTAL_WAITS from v$session_event where sid in (35,28);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 28 Disk file operations I/O 1
  5. 28 cursor: pin S 5225
  6. 28 latch: shared pool 6
  7. 28 SQL*Net message to client 7
  8. 28 SQL*Net message from client 6
  9. 35 Disk file operations I/O 2
  10. 35 db file sequential read 7
  11. 35 cursor: pin S 5235
  12. 35 latch: shared pool 4
  13. 35 SQL*Net message to client 7
  14. 35 SQL*Net message from client 6
  15. 11 rows selected.

其中,“latch: cache buffers chains”一次都没有出现。

2.1.3 版本10.2.0.1.0

步骤类似2.1,省略其中2.1.1.1-2.1.1.2。

2.1.3.1 session 3

  1. SQL> select sid,event,TOTAL_WAITS from v$session_event where sid in (147,148);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 147 latch: cache buffers chains 762
  5. 147 latch: library cache 551
  6. 147 latch: library cache pin 423
  7. 147 SQL*Net message to client 9
  8. 147 SQL*Net message from client 8
  9. 148 latch: cache buffers chains 706
  10. 148 latch: library cache 624
  11. 148 latch: library cache pin 393
  12. 148 SQL*Net message to client 9
  13. 148 SQL*Net message from client 8
  14. 10 rows selected.

出现“latch: cache buffers chains”远远多于在11.2.0.1.0上的次数。并且时间上运行了3个小时(我还是ssd的盘),前面的两个版本都没那么久。

2.2热链竞争

热链竞争下的cbc。

2.2.1 版本11.2.0.1.0


  1. SYS@zkm> set linesize 500
  2. SYS@zkm> select dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,rowid from zkm.test where id=1;
  3. FILE# BLOCK# ROWID
  4. ---------- ---------- ------------------
  5. 4 131 AAAEQGAAEAAAACDAAA
  6. SYS@zkm> select distinct hladdr from x$bh where file#=4 and dbablk=131;
  7. HLADDR
  8. ----------------
  9. 00000003E4734398
  10. SYS@zkm> select a.file#,a.dbablk,b.owner,b.object_name from x$bh a,dba_objects b where a.hladdr='00000003E4734398' and a.obj=b.data_object_id;
  11. FILE# DBABLK OWNER OBJECT_NAME
  12. ---------- ---------- ------------------------------ --------------------------------------------------------------------------------------------------------------------------------
  13. 1 3160 SYS I_MON_MODS$_OBJ
  14. 2 15242 SYS I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST
  15. 4 131 ZKM TEST
  16. 4 4469 ZKM PIS
  17. SYS@zkm> select object_id,data_object_id from dba_objects where owner='ZKM' and object_name='PIS';
  18. OBJECT_ID DATA_OBJECT_ID
  19. ---------- --------------
  20. 17419 17419
  21. SYS@zkm> select dbms_rowid.rowid_create(1,17419,4,4469,0) from dual;
  22. DBMS_ROWID.ROWID_C
  23. ------------------
  24. AAAEQLAAEAAABF1AAA

其中,00000003E4734398是cbc latch的地址。找出这个地址后,在找出这个地址下保护的其他对象。

这里我们挑zkm.pis这张表(文件4,块号4469),因为SYS.I_MON_MODS$_OBJ和SYS.I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST没办法查询,我新构造了zkm.pis这张表直到出现这个00000003E4734398也有zkm.pis的结果。

2.2.1.1 session 1(sid:19)

  1. SYS@zkm> select sid from v$mystat where rownum=1;
  2. SID
  3. ----------
  4. 19
  5. SYS@zkm> declare
  6. 2 r int;
  7. 3 begin
  8. 4 for i in 1..1000000000 loop
  9. 5 select id into r from zkm.test where rowid='AAAEQGAAEAAAACDAAA';
  10. 6 end loop;
  11. 7 end;
  12. 8 /
  13. ---等待

2.2.1.2 session 2(sid:31)

  1. SYS@zkm> select sid from v$mystat where rownum=1;
  2. SID
  3. ----------
  4. 31
  5. SYS@zkm> declare
  6. 2 r int;
  7. 3 begin
  8. 4 for i in 1..1000000000 loop
  9. 5 select count(*) into r from zkm.pis where rowid='AAAEQLAAEAAABF1AAA';
  10. 6 end loop;
  11. 7 end;
  12. 8 /
  13. ---等待

2.2.1.3 session 3

  1. SYS@zkm> select sid,event,state,p1raw,p2raw from v$session where sid in (19,31) order by 2;
  2. SID EVENT STATE P1RAW P2RAW
  3. ---------- ---------------------------------------------------------------- ------------------- ---------------- ----------------
  4. 31 latch: cache buffers chains WAITED SHORT TIME 00000003E4734398 0000000000000096
  5. 19 latch: cache buffers chains WAITED SHORT TIME 00000003E4734398 0000000000000096

session 1和session 2跑期间可以刷出以上结果,其中,p1raw正好是latch的地址。

最后session 1和session 2,通过视图v$session_event查看等待事件的统计如下:

  1. SYS@zkm> select sid,event,TOTAL_WAITS from v$session_event where sid in (19,31);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 19 Disk file operations I/O 1
  5. 19 latch: cache buffers chains 213
  6. 19 SQL*Net message to client 7
  7. 19 SQL*Net message from client 6
  8. 31 Disk file operations I/O 1
  9. 31 latch: cache buffers chains 279
  10. 31 SQL*Net message to client 7
  11. 31 SQL*Net message from client 6
  12. 8 rows selected.

2.2.2 版本11.2.0.4.0

步骤类似2.2.1.1-2.2.1.2,省略。

2.2.2.1 session 3

最后session 1和session 2,通过视图v$session_event查看等待事件的统计如下:

  1. SYS@zkm> select sid,event,TOTAL_WAITS from v$session_event where sid in (29,24);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 24 Disk file operations I/O 1
  5. 24 latch: shared pool 7
  6. 24 SQL*Net message to client 8
  7. 24 SQL*Net message from client 7
  8. 24 SQL*Net break/reset to client 2
  9. 29 Disk file operations I/O 1
  10. 29 latch: shared pool 9
  11. 29 SQL*Net message to client 7
  12. 29 SQL*Net message from client 6
  13. 9 rows selected.

2.2.3 版本10.2.0.1.0

步骤类似2.2.1.1-2.2.1.2,省略。

2.2.3.1 session 3

  1. SQL> select sid,event,state,p1raw,p2raw from v$session where sid in (148,158) order by 2;
  2. SID EVENT STATE P1RAW P2RAW
  3. ---------- ---------------------------------------------------------------- ------------------- ---------------- ----------------
  4. 158 latch: cache buffers chains WAITED KNOWN TIME 0000000082FA5158 000000000000007A
  5. 148 latch: cache buffers chains WAITED KNOWN TIME 0000000082FA5158 000000000000007A

session 1和session 2跑期间可以刷出以上结果,其中,p1raw正好是latch的地址。

最后session 1和session 2,通过视图v$session_event查看等待事件的统计如下:

  1. SQL> select sid,event,TOTAL_WAITS from v$session_event where sid in (148,158);
  2. SID EVENT TOTAL_WAITS
  3. ---------- ---------------------------------------------------------------- -----------
  4. 148 latch: cache buffers chains 773
  5. 148 latch: library cache 794
  6. 148 latch: library cache pin 426
  7. 148 SQL*Net message to client 9
  8. 148 SQL*Net message from client 8
  9. 158 latch: cache buffers chains 673
  10. 158 latch: library cache 950
  11. 158 latch: library cache pin 413
  12. 158 SQL*Net message to client 9
  13. 158 SQL*Net message from client 8
  14. 10 rows selected.

现象和热块竞争时候是一样的。11.2.0.4.0一样模拟不出来“latch: cache buffers chains”。

而且在10.2.0.1.0和11.2.0.1.0中,10g的这个事件次数远多于11g的。

3 热块/链竞争的解决

热链竞争:可以通过修改隐藏参数_db_block_hash_buckets或者_db_block_hash_latches值,它们分别控制HASH Bucket的数量和CBC Latch的数量。修改后,BH和HASH Bucket的对应关系就会被重新计算。原本在同一链表中的BH,重新计算后很可能就不在同一链表中了。不过,不是实在无计可施的情况,不推荐修改这两个参数。

热块竞争:大多是执行计划不合理或者sql有问题导致的。比如等值查询条件表,表又比较大,可以考虑创建唯一索引,因为索引的根块枝块页块表块都是使用共享模式的CBC Latch,不用担心引起争用。

读取模式下cbc latch的事件模拟(热块竞争和热链竞争)-P62的更多相关文章

  1. Release编译模式下,事件是否会引起内存泄漏问题初步研究

    题记:不常发生的事件内存泄漏现象 想必有些朋友也常常使用事件,但是很少解除事件挂钩,程序也没有听说过内存泄漏之类的问题.幸运的是,在某些情况下,的确不会出问题,很多年前做的项目就跑得好好的,包括我也是 ...

  2. Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录

    项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并且将问题修复掉,这种情况肯定是要通过de ...

  3. WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题

    问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...

  4. epoll水平/边缘触发模式下阻塞/非阻塞EPOLLOUT事件触发条件及次数

    在IO多路复用技术中,epoll默认的事件触发模式为Level_triggered(水平触发)模式,即当被监控的文件描述符上有可读/写事件发生时,epoll_wait()会通知处理程序去读写.如果这次 ...

  5. ASM:《X86汇编语言-从实模式到保护模式》越计卷:实模式下对DMA和Sound Blaster声卡的控制

    说实话越计卷作者用了16页(我还是删过的),来讲怎么控制声卡,其实真正归纳起来就那么几点. ★PART1:直接存储访问 1. 总线控制设备(bus master) 在硬件技术不发达的早期,处理器是最重 ...

  6. sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理

    sql服务器第5级事务日志管理的阶梯:完全恢复模式下的日志管理 原文链接http://www.sqlservercentral.com/articles/Stairway+Series/73785/ ...

  7. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟

    中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...

  9. 软件调试——IA-32 保护模式下寄存器一览

    最近在看张银奎先生的<调试软件>一书,想将关键的技术记录下来,以便日后查阅,也分享给想看之人吧. 1 通用寄存器 EAX,EBX,ECX,EDX:用于运算的通用寄存器,可以使用AX,BX等 ...

随机推荐

  1. Java实现 LeetCode 327 区间和的个数

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  2. Java实现 LeetCode 260 只出现一次的数字 III(三)

    260. 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出 ...

  3. Java中System的详细用法

    System.arraycopy System.arraycopy的函数原型是: public static void arraycopy(Object src, int srcPos, Object ...

  4. java实现第五届蓝桥杯等额本金

    等额本金 题目描述 小明从银行贷款3万元.约定分24个月,以等额本金方式还款. 这种还款方式就是把贷款额度等分到24个月.每个月除了要还固定的本金外,还要还贷款余额在一个月中产生的利息. 假设月利率是 ...

  5. Linux 文件系统常用命令

    文件系统查看命令df df:查看分区,单位默认是KB df -h 统计目录或文件大小du du /etc/:会列出/etc/目录下的所有子目录所占的空间,最后给出/etc/目录的大小,属于高负载命令, ...

  6. vue+jquery使用FormData向后端传递数据和文件,express如何获取

    使用multiparty 模块 下载 cnpm install multiparty --save 前端代码: <template> <div class="add-are ...

  7. Centos7.x RPM安装ELK 7.5.0

    一.环境介绍   单位需要分析tomcat 日志和业务日志,比较以后还是选择用ELK 来进行日志的分析,以及可视化的展示. 系统环境 服务器: 1.AWS EC2 2C8G [root@ip-10-0 ...

  8. 2020/06/05 JavaScript高级程序设计 函数表达式

    函数表达式 函数定义的两种方式: 函数声明(函数声明提升,非标准name属性可访问给函数指定的名字) 函数声明提升:执行代码前先读取函数声明 function functionName(arg0, a ...

  9. @topcoder - 2013TCO3A D1L3@ TrickyInequality

    目录 @description@ @accepted code@ @accepted code@ @details@ @description@ 现有不等式组: \[\begin{cases} x_1 ...

  10. SDL2 gif动态图加载

    参照 https://tieba.baidu.com/p/3569073088?tpl=5&red_tag=1777318765 使用mingw工具链 #include <stdbool ...