等待事件latch: cache buffers chains 的分析与优化

荞麦2年前技术文章1019

等待事件latch: cache buffers chains 的分析与优化

要理解latch: cache buffers chains并解决这个问题,就需要深入的了解Buffer Cache及其原理。

1Buffer Cache概述

Buffer CacheSGA的一部分,Oracle利用Buffer Cache来管理data blockBuffer Cache的最终目的就是尽可能的减少磁盘I/O

内存中数据块的存放位置是记录在一个hash列表当中的。 当一个会话需要访问某个数据块时它首先要搜索这个hash 列表从列表中获得数据块的地址然后通过这个地址去访问需要的数据块这个列表 Oracle 会使用一个latch来保护它的完整性。 当一个会话需要访问这个列表时需要获取一个Latch只有这样才能保证这个列表在这个会话的浏览当中不会发生变化。

2如何定位数据块是否在buffer cache

首先,通过对数据块所在的文件号和块号进行hash计算,算出对应bucket号(hash bucket)。

 


沿着对应hash bucket所在hash chain list访问链上的buffer headerbh,相关信息由x$bh视图描述),hash chain list上挂载了一或多个bhbhData block一一对应。

 





 

 

3latch:cache buffers chains出现的原因

3.1  不够优化的SQL

大量逻辑读的SQL语句就有可能产生非常严重的latch:cache buffers chains等待,因为每次要访问一个block,就需要获得该latch,由于有大量的逻辑读,那么就增加了latch:cache buffers chains争用的机率。   对于正在运行的SQL语句,产生非常严重的latch:cache buffers chains争用,可以利用下面SQL查看执行计划,并设法优化SQL语句。

select * from table(dbms_xplan.display_cursor(sql_id,plan_hash_value));

如果SQL已经运行完毕,我们就看AWR报表里面的SQL Statistics->SQL ordered by Gets->Gets per Exec,试图优化这些SQL

示例读库拉报表卡慢

分析SQL的执行计划发现使用了MERGE JOIN CARTESIAN(笛卡尔积)执行计划如下

 

SQL单次执行时间超过1小时修改参数关闭笛卡尔积然后SQL产生了新的执行计划优化后执行时间不足1该等待事件大部分可通过优化SQL解决

3.2 热点块争用

1)查找数据库是否存在latch的争用
select sid,event,p1,p1raw from v$session_wait where event='latch: cache buffers chains';

2)下面查询查出Top 5 的争用的latch address
select * from( select CHILD#,ADDR,GETS ,MISSES,SLEEPS from v$latch_children where name = 'cache buffers chains' and misses>0 and sleeps>0 order by 5 desc, 1, 2, 3) where rownum<=5

 

3)然后利用下面查询找出Hot block    

SELECT  

  /*+ RULE */  

  E.OWNER  

  || '.'  

  || E.SEGMENT_NAME SEGMENT_NAME,  

  E.PARTITION_NAME,  

  E.EXTENT_ID EXTENT#,  

  X.DBABLK - E.BLOCK_ID + 1 BLOCK#,  

  X.TCH,  

  L.CHILD#  

FROM SYS.V$LATCH_CHILDREN L,  

  SYS.X$BH X,  

  SYS.DBA_EXTENTS E  

WHERE X.HLADDR='00000001F8C387C0'  

AND E.FILE_ID = X.FILE#  

AND X.HLADDR  = L.ADDR  

AND X.DBABLK BETWEEN E.BLOCK_ID AND E.BLOCK_ID + E.BLOCKS - 1  

ORDER BY X.TCH DESC;

3.3 改嵌套循环为hash join

分析引起该等待事件的SQL的执行计划发现使用了嵌套循环执行计划如下

 

可以通过hint使用/*+use_hash(t1 t2)*/指定关联方式hash join主要适用于两表差距很大,小表可以完全放入内存情况

3.4 Hash Bucket太少

需要更改_db_block_hash_buckets隐含参数。其实在Oracle9i之后,我们基本上不会遇到这个问题了,除非遇到Bug。所以这个是不推荐的,记住,在对Oracle的隐含参数做修改之前一定要咨询Oracle Support 

3.5 Latch太少

需要更改_db_block_lru_latches隐含参数10G之后该参数默认为cpu_count8说明该参数依赖CPU配置不建议自行修改


相关文章

shell脚本-expect

shell脚本-expect

一、概述       Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。       在一些需要交互输入指令的场景下,...

Golang 垃圾回收

Golang 垃圾回收

1、标记清除算法Golang 使用标记清除算法作为垃圾回收器的一部分。标记清除算法是一种常见的垃圾回收算法,它通过标记和清除未被引用的对象来回收内存空间。Golang 中,垃圾回收器会定期扫描堆空间,...

企业级大数据安全架构(四)

企业级大数据安全架构(四)

Ranger是支持审计功能的,安装时可以选择审计数据保存的位置,默认支持Solr和HDFS。HDFS的配置比较简单,这里就不赘述了,我们这里使用Ambari默认自带的Solr保存审计日志,下面部署So...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

高效便捷!解锁阿里云跨账号专线互联的全新实施方案

01背    景为持续提升金融云环境的合规标准以及可用区内产品服务的性能和稳定性,阿里云将对杭州地域BCD三个金融云可用区进行基础设施架构升级与改造,对应可用区云产品将于 2024...

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

proxysql作为一个程序,本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。可以在多个节点上部署proxysql,在proxysql之前再加一层负...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。