latch: cache buffers chains

今天一到早接到报警短信,cpu使用率增至100%,因为是Linux Sever,为了不使Server crash,先登上去杀去部分LOCAL=NO的进程。

接着查看活动的会话:

SELECT
  (SELECT b.SQL_TEXT FROM v$sqlarea b WHERE b.SQL_ID=a.SQL_ID
  ) sqltxt,
  (SELECT c.SQL_FULLTEXT FROM v$sqlarea c WHERE c.SQL_ID=a.SQL_ID
  ) sqlfulltxt,
  a.username,
  a.LAST_CALL_ET,
  a.MACHINE ,
  a.command,
  a.EVENT,
  a.SQL_ID ,
  a.SID,
  a.SERIAL#,
  'alter system kill session '''
  || a.SID
  ||','
  ||a.SERIAL#
  ||''';' AS killstment
FROM v$session a
WHERE a.STATUS      = 'ACTIVE'
AND a.USERNAME NOT IN ('SYS', 'SYSTEM')
ORDER BY a.LAST_CALL_ET DESC ,
  a.username,
  a.MACHINE ,
  a.command,
  a.EVENT,
  a.SQL_ID ,
  a.SID 

有很多latch: cache buffers chains event

当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,oracle称其为hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得”cache buffers chains” latch。

原因一:低效率的SQL语句(主要体现在逻辑读过高)
cache buffers chains latch很大程度与逻辑读有关,所以要观注v$sql中BUFFER_GETS/EXECUTIONS大的语句。
同时每一个逻辑读需要一个latch get 操作及一个cpu操作,这样的sql也会很耗cpu资源。

原因二:热块(访问过于频繁)

查找热块:

SELECT OBJECT_NAME,
  SUBOBJECT_NAME
FROM DBA_OBJECTS
WHERE DATA_OBJECT_ID IN
  (SELECT DATA_OBJECT_ID
  FROM
    (SELECT OBJ DATA_OBJECT_ID,
      FILE#,
      DBABLK,
      CLASS,
      STATE,
      TCH
    FROM X$BH
    WHERE HLADDR IN
      (SELECT ADDR
      FROM
        (SELECT ADDR FROM V$LATCH_CHILDREN ORDER BY (GETS + MISSES + SLEEPS) DESC
        )
      WHERE ROWNUM < 10
      )
    ORDER BY TCH DESC
    )
  WHERE ROWNUM < 10
  );


但是此次事件是由于一个sql并发,产生大量逻辑读引起的,由于昨晚系统上线,开发没有注意创建表上的索引,致使全表扫描造成大量的逻辑读,创建索引后cpu回到20%波动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值