数据块在buffer cache存放是以linked list方式存放的。当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于buffer cache中,检查相同的SQL语句是否存在于library cache中也是通过hash算法实现的。要判断block是否存在于buffer cache中,就需要扫描linked list(此处都是串行的,不能并发),获取block的信息。而扫描linked list必须获得一个latch,防止并发对linked list照成破坏,如果未能获得该latch,就会在数据库中标记一个latch: cache buffers chains这个等待事件。如果该block存在于buffer cache中就不需要物理读,如果不存在,就需要从磁盘读取该block到buffer cache中。为了能够读取,并修改该block,我们就需要pin住该block,防止并发对于该block造成破坏,所以如果别的session不能获得pin,同时会标记一个buffer busy waits等待事件。

一般产生CACHE BUFFERS CHAINS的原因有几个方面:1、buffer cache太少(也说明SQL语句效率低);2、热块挣用。(从oracle9i开始,对latch:cache buffer chains支持只读共享访问,这可以减少部分争用,但并不能完全消除争用。)

一、buffer cache太少(也说明SQL语句效率低)

应用程序执行多个相同的低效率SQL语句并发会话,这些SQL语句都设法得到相同的数据集。较多的逻辑读意味着较多的latch get操作,从而增加了锁存器争用。多个进程同时扫描大范围的索引或表时,可能广泛地发生cache buffers chains 锁存器争用。每次执行都带有高 BUFFER_GETS(逻辑读取)的SQL语句是主要的原因。

1、查看当前的等待事件 ( latch: cache buffers chains)

SQL> select event, count(*) from v$session

where wait_class <> 'Idle' group by event order by 2;

2、查看 latch: cache buffers chains事件相关的会话信息

SQL> select sid,username,machine,program,p1raw,sql_id,logon_time,last_call_et from v$session where event='latch: cache buffers chains';

二、热块挣用

当多个会话重复访问一个或多个由同一个子cache buffers chains锁存器保护的块时,就会产生热块挣用。当多个会话争用cache buffers chains锁存器时,找出是否有热块的最好的方法是检查latch free等待事件的P1RAW参数值。

判断热块挣用的另一种方法是从 v$session_wait 视图获得锁存器地址后进行比较。v$session_wait的P1RAW就相当于子锁存器地址,若从 v$session_wait 视图获得的锁存器地址过多重复出现,就意味着对相应锁存器发生次数偏多,此时可解释为热快引起的争用。如果会话正在相同的锁存器地址上等待,就是热块。

SQL> select sid,p1raw,p2,p3,seconds_in_wait,wait_time,state from v$session_wait

where event='latch: cache buffers chains' order by 3,2;

查看热块的对象:

根据TCH值确认热块。注意块从LRU列表的冷端移动到热端时,TCH值将重置为0,所以判断的时候,要注意TCH为0的块不一定是冷块。

使用P1RAW=00000300DA316800为例子进行关联热快对象。

SQL> select a.hladdr,a.file#,a.dbablk,a.tch,a.obj,b.object_name from x$bh a, dba_objects b

where (a.obj = b.object_id or a.obj = b.data_object_id) and a.hladdr = '00000300DA316800'

union select hladdr,file#,dbablk,tch,obj,null from x$bh

where obj in (select obj from x$bh where hladdr = '00000300DA316800' minus select object_id from dba_objects minus select data_object_id from dba_objects) and hladdr = '00000300DA316800' order by 4;

若没有关于SQL语句的信息,也有方法间接判断是热块引起的问题,还是低效SQL语句引起的问题。v$latch_children视图中,比较子cache buffers chains锁存器相应的 child#、gets、sleeps值, 以此判断特定子锁存器上使用的次数和争用是否集中,利用以下语句,获取sleeps次数高的子锁存器。

SQL> select * from (select addr, child#, gets, sleeps from v$latch_children where name = 'cache buffers chains' order by sleeps desc)

where rownum < =20;

当结果中sleeps的值倾斜较大的时候就说明是热块挣用。

根据sleeps较高的addr确定哪些块是热块。

SQL> select hladdr,obj,(select object_name from dba_objects where (data_object_id is null and object_id = x.obj) or data_object_id = x.obj and rownum = 1) as object_name,dbarfil,dbablk,tch from x$bh x where hladdr ='&p1raw' order by hladdr, obj;

数据块在buffer cache存放是以linked list方式存放的。当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于buffer cache中,检查相同的SQL语句是否存在于library cache中也是通过hash算法实现的。要判断block是否存在于buffer cache中,就需要扫描linked list(此处都是串行的,不能并发),获取block的信息。而扫描linked list必须获得一个latch,防止并发对linked list照成破坏,如果未能获得该latch,就会在数据库中标记一个latch: cache buffers chains这个等待事件。如果该block存在于buffer cache中就不需要物理读,如果不存在,就需要从磁盘读取该block到buffer cache中。为了能够读取,并修改该block,我们就需要pin住该block,防止并发对于该block造成破坏,所以如果别的session不能获得pin,同时会标记一个buffer busy waits等待事件。 一般产生CACHE BUFFERS CHAINS的原因有几个方面:1、buffer cache太少(也说明SQL语句效率低);2、热块挣用。(从oracle9i开始,对latch:cache buffer chains支持只读共享访问,这可以减少部分争用,但并不能完全消除争用。) 一、buffer cache太少(也说明SQL语句效率低) 应用程序执行多个相同的低效率SQL语句并发会话,这些SQL语句都设法得到相同的数据集。较多的逻辑读意味着较多的latch get操作,从而增加了锁存器争用。多个进程同时扫描大范围的索引或表时,可能广泛地发生cache buffers chains 锁存器争用。每次执行都带有高 BUFFER_GETS(逻辑读取)的SQL语句是主要的原因。 1、查看当前的等待事件 ( latch: cache buffers chains) SQL> select event, count(*) from v$session  where wait_class <> 'Idle' group by event order by 2; 2、查看 latch: cache buffers chains事件相关的会话信息 SQL> select sid,username,machine,program,p1raw,sql_id,logon_time,last_call_et from v$session where event='latch: cache buffers chains'; 二、热块挣用 当多个会话重复访问一个或多个由同一个子cache buffers chains锁存器保护的块时,就会产生热块挣用。当多个会话争用cache buffers chains锁存器时,找出是否有热块的最好的方法是检查latch free等待事件的P1RAW参数值。 判断热块挣用的另一种方法是从 v$session_wait 视图获得锁存器地址后进行比较。v$session_wait的P1RAW就相当于子锁存器地址,若从 v$session_wait 视图获得的锁存器地址过多重复出现,就意味着对相应锁存器发生次数偏多,此时可解释为热快引起的争用。如果会话正在相同的锁存器地址上等待,就是热块。 SQL> select sid,p1raw,p2,p3,seconds_in_wait,wait_time,state from v$session_wait where event='latch: cache buffers chains' order by 3,2; 查看热块的对象: 根据TCH值确认热块。注意块从LRU列表的冷端移动到热端时,TCH值将重置为0,所以判断的时候,要注意TCH为0的块不一定是冷块。 使用P1RAW=00000300DA316800为例子进行关联热快对象。 SQL> select a.hladdr,a.file#,a.dbablk,a.tch,a.obj,b.object_name from x$bh a, dba_objects b where (a.obj = b.object_id or a.obj = b.data_object_id) and a.hladdr = '00000300DA316800' union select hladdr,file#,dbablk,tch,obj,null from x$bh where obj in (select obj from x$bh where hladdr = '00000300DA316800' minus select object_id from dba_objects minus select data_object_id from dba_objects) and hladdr = '00000300DA316800' order by 4; 若没有关于SQL语句的信息,也有方法间接判断是热块引起的问题,还是低效SQL语句引起的问题。v$latch_children视图中,比较子cache buffers chains锁存器相应的 child#、gets、sleeps值, 以此判断特定子锁存器上使用的次数和争用是否集中,利用以下语句,获取sleeps次数高的子锁存器。 SQL> select * from (select addr, child#, gets, sleeps from v$latch_children where name = 'cache buffers chains' order by sleeps desc) where rownum < =20; 当结果中sleeps的值倾斜较大的时候就说明是热块挣用。 根据sleeps较高的addr确定哪些块是热块。 SQL> select hladdr,obj,(select object_name from dba_objects where (data_object_id is null and object_id = x.obj) or data_object_id = x.obj and rownum = 1) as object_name,dbarfil,dbablk,tch from x$bh x where hladdr ='&p1raw' order by hladdr, obj;

latch:cache buffers chains的优化思路的更多相关文章

  1. 关于latch: cache buffers chains的sql优化

    前段时间,优化了一些耗buffer比较多的sql,但是CPU使用率还是没下来 . 查看操作系统CPU使用率 查看awr,发现又有一条超级耗性能的sql冒出来了. 该SQL每次执行耗费3e多个buffe ...

  2. latch: cache buffers chains故障处理总结(转载)

    一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当 ...

  3. latch: cache buffers chains故障处理总结

    一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当 ...

  4. [转帖]深入理解latch: cache buffers chains

    深入理解latch: cache buffers chains http://blog.itpub.net/12679300/viewspace-1244578/ 原创 Oracle 作者:wzq60 ...

  5. 【转载】latch: cache buffers chains

    本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们 ...

  6. Oracle索引失效问题:WHERE C1='' OR C2 IN(SubQuery),并发请求时出现大量latch: cache buffers chains等待

    问题描述: 项目反馈某功能响应时间很长,高峰期时系统整体响应很慢... 获取相应的AWR,问题确实比较严重,latch: cache buffers chains等待,因为这些会话SQL执行时间太长, ...

  7. 案例:latch: cache buffers chains event tuning

    前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...

  8. 又是latch: cache buffers chains惹得祸

    前言 一大早,客户给我打电话说: xx,应用很慢,查询数据总是超时,让我看看... 根据多年DBA经验,首当其冲的肯定是去查询数据库在这段时间都在干嘛. 分析 导出awr报告分析 1). 数据库在此时 ...

  9. cache buffers chains latch

    cache buffers chains latch 从 Oracle 8i Database 开始, 散列锁存器<-------(1:m)------>hash bucket<-- ...

随机推荐

  1. 【转】我的电脑最近忽然开不了机,启动修复也无法修复,win7系统。开机的时候如果不点启动修复直接正常启动

    原文网址:http://wenda.haosou.com/q/1356139178064356 你好,电脑开机蓝屏主要是:“磁盘有错误”或“非正常关机”引起!这是解决方法:(原创,引用请说明作者:力王 ...

  2. SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题

    转:http://blog.csdn.net/miragesky2049/article/details/7204882 SharePoint2010沙盒解决方案基础开发--关于TreeView树形控 ...

  3. HDOJ--1698

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 使用VisualStudio进行单元测试之一

    使用VisualStudio中的单元测试功能,可以很方便的创建单元测试项目.编写单元测试代码以及执行单元测试.而如何在VisualStudio中使用单元测试功能,就是本文和后面几篇想要说的了.    ...

  5. Bzoj 3450: Tyvj1952 Easy 期望/概率,动态规划

    3450: Tyvj1952 Easy Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 431  Solved: 325[Submit][Status] ...

  6. Power of Cryptography

    //只用一行核心代码就可以过的天坑题目............= = 题目: Description Current work in cryptography involves (among othe ...

  7. final、抽象类、接口、多态、

       final———最终.作为一个修饰符 可以修饰类. 函数. 变量: 被final修饰的类不可以被继承: 被final修饰的方法不可以被重写: 被final修饰的变量只能够被赋值一次,既可以修饰成 ...

  8. 通讯录改造——MVC设计模式

    将之前用servlet写的程序转化为jsp+servlet的简单的MVC的三层结构.项目中程序的包如图 首先是实体对象: package com.contactSystem.entiey; publi ...

  9. Choosing a Linux Tracer ------Brendan Gregg's Blog

    home Choosing a Linux Tracer (2015) 08 Jul 2015 Linux Tracing is Magic! A tracer is an advanced perf ...

  10. windows修改mysql默认字符集不成功

    今天下午弄了半天,终于把mysql的默认字符集弄成了, 按照网上的说法,什么修改mysql下面的my.ini文件,把参数设置成utf-8,我反复操作,结果都是不成功,后来我把mysql5.0卸载了,网 ...