SQL中出现latch:cache buffers chains报错怎么解决

发布时间:2022-01-11 17:14:37 作者:iii
来源:亿速云 阅读:224

这篇文章主要介绍了SQL中出现latch:cache buffers chains报错怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL中出现latch:cache buffers chains报错怎么解决文章都会有所收获,下面我们一起来看看吧。

1.产生原理

当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hash chain)中。该内存结构由一系列cache buffers chains子latch保护(又名hash latch或者cbc latch)。对Buffer cache中的块,要select或者update、insert,delete等,都得先获得cache buffers chains子latch,以保证对chain的排他访问。若在过程中发生争用,就会等待latch:cache buffers chains事件。

2.产生原因:

(1). 低效率的SQL语句(主要体现在逻辑读过高) 在某些环境中,应用程序打开执行相同的低效率SQL语句的多个并发会话,这些SQL语句都设法得到相同的数据集,每次执行都带有高 BUFFER_GETS(逻辑读取)的SQL语句是主要的原因。相反,较小的逻辑读意味着较少的latch get操作,从而减少锁存器争用并改善性能。注意v$sql中BUFFER_GETS/EXECUTIONS大的语句。

(2).Hot block 当多个会话重复访问一个或多个由同一个子cache buffers chains锁存器保护的块时,热块就会产生。当多个会话争用cache buffers chains子锁存器时,就会出现这个等待事件。有时就算调优了SQL,但多个会话同时执行此SQL,那怕只是扫描特定少数块,也是也会出现HOT BLOCK的。

3.解决方法

(1).优化SQL,如优化nested loop join,如果有可能使用hash join代替nested loop join。

(2).可以利用对热块索引进行hash分区,或者使用hash簇的方式减缓热块现象。

(3).调整表的pctfree值,将数据尽可能的分布到多个块中,但相同的查询要扫更多块,有负面作用。

(4).并行查询是直接读数据文件,不经过SGA,即direct path read,所以就不存在锁存器争用的情况了。但其一般是为了大量数据读取而使用的,不作为一般的解决方案。

(5).等问题自己消失。有时当出现latch争用时,故障时刻确实没有较好的方式解决,找到病因才是关键。

4.查找热点快对象

是从当前等待latch:cache buffers chains事件的会话出发。通过v$session_wait视图,获得P1RAW即子锁存器的地址。通过重复观察v$session_wait视图,发现某个子锁存器地址较多地出现,那么该子锁存器管辖的chain可能有热块。

select p1,p1raw from v$session_wait where event='latch: cache buffers chains';

所以v$session的p1raw与x$bh的laddr,以及v$latch_children的addr是同样的东西,都是子锁存器的地址。大概思路是,通过子锁存器的热度来找到所管辖的对象,以及对象的热度。

通过子锁存器地址,即v$latch_children的addr字段,来获取这些子锁存器所管理的对象的文件号块号与热度。 注意到x$bh字典表中的tch字段表示的就是block的touch count,一般来说这个值越高那么这个块就越热,我们称这样的块就叫做热点块。

  1. SELECT hladdr,

  2.          obj,

  3.          (SELECT object_name

  4.             FROM dba_objects

  5.            WHERE (data_object_id IS NULL AND object_id = x.obj)

  6.                  OR data_object_id = x.obj AND ROWNUM = 1)

  7.             AS object_name,

  8.          dbarfil,

  9.          dbablk,

  10.          tch

  11.     FROM x$bh x

  12.    WHERE hladdr IN ('00000000DA253C08', '00000000DA380310')

  13. ORDER BY tch DESC;


根据FILE#,dbablk来找出对应对象。 

  1. select * from dba_extents where file_id=10 and 36643122 between block_id and block_id + blocks - 1;

  1. select * from dba_extents where file_id=10 and 36643122 between block_id and block_id + blocks - 1;

关于“SQL中出现latch:cache buffers chains报错怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SQL中出现latch:cache buffers chains报错怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. MySQL中通过EXPLAIN如何分析SQL的执行计划详解
  2. MySql中怎么使用explain查询SQL的执行计划

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sql

上一篇:BufferQueue的设计思想和内部实现方法是什么

下一篇:MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决方法是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》