现在的位置: 首页 > 综合 > 正文

引发latch: cache buffers chains及事件模拟

2014年07月31日 ⁄ 综合 ⁄ 共 1279字 ⁄ 字号 评论关闭

        在帮助文档的Oracle® Database Performance Tuning Guide:Thecachebufferschains latches are used to
protect a buffer list in the buffer cache. These latches are used when searching for, adding, or removing a buffer from the buffer cache. Contention on this latch usually means that there is a block that is greatly contended for (known as a hot block).

      当一个会话需要去访问一个内存块时,它首先要去一个像链表一样的结构中去搜索这个数据块是否在内存中,当会话访问这个链表时需要获得一个latch,如果获取失败,将会产生latch: cache buffers chains等待,导致这个等待的原因是访问相同的数据块的会话太多或则列表太长。

      近期数据库出现过两起因为引起latch: cache buffers chains等待等待事件而造成数据库服务器CPU飙高,严重的一次在3小时之内,数据库CPU极不稳定,造成系统时而可用,时而不可用。两次场景描述:

       1. 取的是4个小时的AWR报告,有一条SQL语句(有绑定变量)执行307次,执行时间总共耗时37,896s,消耗CPU共29,870s。分析原因,此SQL的逻辑读每次为200多万次,应该在短时间内并发执行,造成热块。

       2. 一条count(*)的SQL在3小时内执行33,629次,执行时间总共耗时82,376s,消耗CPU共7,800s.分析原因,也是热块引起。

       解决办法:

       1. 降低逻辑读,这条SQL用到了一个很大的视图,在代码中搜索到视图用的地方,能不用的尽量不用,查出的列太多,去掉一部分。

       2. 平时一天的执行次数只有2千多次,今天算是爆发了,需要查看代码中是否有循环调用的情况。

session1:

SQL> create table test as select * from dba_objects;
SQL>declare
    j number;
begin
for i in 1..307000 loop
   select count(1) into j from test;
end loop;
end;

session2:

SQL>declare
    j number;
begin
for i in 1..307000 loop
   select count(1) into j from test;
end loop;
end;

session3:

SQL>declare
    j number;
begin
for i in 1..307000 loop
   select count(1) into j from test;
end loop;
end;

用这条语句可以看到具体的等待事件session:select  * from v$session_wait where event='latch: cache buffers chains';

抱歉!评论已关闭.