欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

sql执行计划错误之cache buffers chain

程序员文章站 2022-03-14 20:01:27
...

都是这个order by desc使CBO倾向于走INDEX FULL SCAN DESCENDING(如果你有相关的知识,应该知道,index_fs会读取所有的索引块,当

分享个小案例:

今天某个库出现了cache buffers chain,最近应用没啥变更,怎么会突然出现呢,当然latch:cache buffers chain的作用是db cache中Find data很重要的latch,不管逻辑读,物理读(也要经历逻辑读),如果link或者unlink一个buffer到不同的Hash Bucket,再或者pin,unpin一个buffer,都要获得相关bucket上相关的cache buffers chain latch。所以,,关联到sql上,正如我们通常说的,调sql的一个目标就是减少资源的消耗,包括降低逻辑读,如果某个sql的读的块很多,那么和其它在访问相同数据的session就会争夺cache buffers chain latch(因为决定buffer被连接到那个bucket里面是由block的信息决定的,一个cache buffers chain latch会保护多个bucket,如果很多访问一个bucket里面的buffer,此时就会导致次latch的争用,也就是我们说的热块)所以,应用最近没啥变更,可以肯定是某些sql走错了执行计划。

我们收集统计信息是按照segment_size大于150M,并且每天的变化量超过20%的对象才会收集统计信息。所以对于有些对象没达到这个

收集的条件,统计信息可能是很久以前的或者是缺失,数据变化较大的时候,可能导致执行计划错误。

查看下当时ASH信息:

  • 很明显,sql_id:0a3zj3m5h72rb嫌疑比较大,看看执行计划:

    当前的执行计划: 【Linux公社 】

    当然这个sql很简单,执行计划也很简单,我们先看下这个表上索引的信息:

    sql执行计划错误之cache buffers chain