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

        在帮助文档的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';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值