latch:cache buffers chains的优化思路

数据块在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;

时间: 2024-12-24 10:27:33

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

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

一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当时忘了记录log,这里总结下处理思路,以便下次查看. 故障分析思路 查看等待事件,判断故障起因 SQL>select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait wher

latch: cache buffers chains故障处理总结

故障分析思路 查看等待事件,判断故障起因 SQL>select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait where wait_class# <> 6 order by wait_time desc) where rownum <=10; 确认为latch: cache buffers chains引起的故障后,查看latch的命中率 SQL>S

WAIT EVENT: latch: cache buffers chains

关于CACHE BUFFERS CHAINS描述 CACHE BUFFERS CHAINS latch is acquired when searching for data blocks cached in the buffer cache. Since the Buffer cache is implemented as a sum of chains of blocks, each of those chains is protected by a child of this latch

【转载】latch: cache buffers chains

本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们称其这hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得"cache buffers chains" latch. 原因一:低效率的SQL语句(主要体现在逻辑读过高) cache buffe

cache buffer 相关的闩锁等待事件(cache buffers lru chain/cache buffers chain)

cache buffers lru chain原因高负荷的cache吞吐量,效率差的sql语句(全表扫描,或不正确的index range scans)dbwr写出速度太慢,前台进程花费很多时间持有latch查找free buffer. cache buffers lru chain保护buffer的链表在cache中,当增加,移除,移动一个buffer从list时,cblc latch必须被获取.在SMP(对称多处理)的系统上,oracle自动设置LRU latche数量是cpu个数的一半.在

shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)

[深入解析--eygle]学习笔记 1.1.2  Cache BuffersLRU Chain闩锁竞争与解决 当用户进程需要读数据到Buffer Cache时或Cache Buffer根据LRU算法进行管理等,就不可避免的要扫描LRU  List获取可用Buffer或更改Buffer状态,我们知道,Oracle的Buffer Cache是共享内存,可以为众多并发进程并发访问,所以在搜索的过程中必须获取Latch(Latch是Oracle的一种串行锁机制,用于保护共享内存结构),锁定内存结构,防止

[转载]Buffer cache的调整与优化

Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的free buffer waits事件.下面将具体描述Buffer Cache的作用.调整与优化. 一.SGA的所有组件 从动态视图v$sga_dynamic_components获取SGA的相关信息 SELECT component, current_size, min_size FROM v$sga_dynamic_components; COM

系统性能排查命令及优化思路

最近笔者经常处理了一些线上的问题机器.特抽空写一篇文章将处理系统性能问题和优化思路进行总结,方便后续工作中系统故障的排查.作为运维,收到网管系统性能报警应该是常有的事情.而快速进行问题定位并解决则是工作的关键.我们在排查或者优化一个系统的时候无外乎从以下几个方面考虑: 1.CPU的使用率异常,如某个核心的使用率过高,而其它核心则处于空闲的状况. 2.内存的使用状况:通常需要注意是否程序内存泄漏导致的. 3.磁盘IO性能:通常磁盘IO不正常时我们需要判断程序是否处在顺序读写的状态. 4.网络IO负

Buffer cache 的调整与优化

Buffer cache 的调整与优化 -============================== -- Buffer cache 的调整与优化(一) --============================== Buffer Cache是SGA的重要组成部分,主要用于缓存数据块,其大小也直接影响系统的性能.当Buffer Cache过小的时候,将会造成更多的free buffer waits事件. 下面将具体描述Buffer Cache的作用,调整与优化. 一.SGA的所有组件 从动态