暂无图片
视图v$sql_cs_selectivity 同一个RANGE_ID之下出现了同一个微词的重复记录。
我来答
分享
周伟
2024-02-18
视图v$sql_cs_selectivity 同一个RANGE_ID之下出现了同一个微词的重复记录。

请教各位专家,

我在研究19c的自适应游标共享这个特性时,遇到在视图 v$sql_cs_selectivity 里面出现一些奇怪的重复记录,比如:
图片.png
如图中所示,游标143里面,RANGE_ID都为0的情况下,三个谓词条件都出现了重复的记录,其LOW/HIGH值都是一样的。
在我的理解当中,同一个谓词,同一个RANHGE_ID,同一个LOW/HIGH 的情况下,应该只有一条记录才对。
SQL里面的谓词条件变量,也没有重复的情况。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
周伟
2024-02-18

另外更奇怪的是,这个SQL的子游标很多,但是几乎每产生新的子游标,它的LOW/HIGH 范围,都能在前面的子游标里面找到一模一样的,也就是两个游标完全就是一样的,那么这样的话按理是不应该走硬解析产生新的子游标才对,但是它就是产生了,比如这样:
图片.png
子游标576,574,572 这三个完全是一模一样的。

暂无图片 评论
暂无图片 有用 6
打赏 0
lianR
2024-02-20

这个问题可能是由于Oracle数据库的自适应游标共享特性引起的。在Oracle  19c中,自适应游标共享特性可以根据查询的选择性动态地改变游标的共享方式。这意味着,对于相同的SQL语句,Oracle可能会生成多个不同的游标,每个游标都有不同的执行计划。

在你的情况下,可能是由于查询的选择性发生了变化,导致Oracle生成了新的游标。即使这些游标的LOW/HIGH范围与前面的游标完全相同,但由于查询的选择性发生了变化,Oracle可能会选择一个不同的执行计划,因此需要生成新的游标。

另外,v$sql_cs_selectivity视图中的重复记录可能是由于多个会话同时执行相同的SQL语句引起的。每个会话都会在视图中生成一个记录,因此可能会出现重复的记录。

如果你想避免这种情况,可以考虑关闭自适应游标共享特性,或者使用绑定变量来避免查询的选择性发生变化。

暂无图片 评论
暂无图片 有用 1
打赏 0
周伟
题主
2024-02-20
感谢回答。产生多个游标本身就是自适应游标功能的结果,新的选择性范围只有超出了前面所有游标已有的范围的时候,才会因为这个原因重新进行硬解析,游标失效的原因就回被打上BIND_EQUIV_FAILURE=Y的标签,基于这个理论,这一点上这个现象就已经解释不通了,数百个游标它的选择性范围完全一模一样,一点儿都没有增加或者改变,既如此那就不应该产生新游标才对,这是我第一个疑惑的地方;第二个疑惑的地方就是重复记录的问题,v$sql_cs_selectivity 视图应该不是以会话为单位,而是以游标为单位,同一个SQL_ID,同一个CHILD_NUMBER之下,同一个RANGE_ID,他的记录应该是唯一的才对,如果以会话为单位,如何解释所有的重复记录全部都是重复两次,而不是重复三次或者多次,我也问过前端的同事,他们说这个SQL就是前端业务完成一笔就会执行一次,不存在完成一笔需要同时并行执行这个SQL的情况。另外一个现象就是,这个SQL游标失效的原因,BIND_EQUIV_FAILURE和ROLL_INVALID_MISMATCH的原因完全一样多,这也是我一直困惑的地方,感觉像是每一次产生新游标的时候,都是因为统计信息失效了,于是走硬解析,既然统计信息都失效了,那选择性啥的自然也就对不上了,于是出现一次ROLL_INVALID_MISMATCH就伴随着一次BIND_EQUIV_FAILURE啥的,不过我胡乱猜测的。但是统计信息这个东西,除了数据库每天自动搜集信息以外,别的确实没有在什么地方去手工搜集它。。。这整个现象一圈儿下来,我更感觉像是碰到了什么BUG之类的。
lianR
2024-02-20

从你的描述来看,这确实是一个复杂的问题,可能涉及到Oracle数据库的内部机制和实现细节。以下是我对你的疑惑的一些想法:
1.  对于多个游标的问题,可能是由于某些原因导致Oracle认为需要为每个会话创建一个新的游标。这可能是由于某些会话级别的设置或者状态,比如NLS设置,优化器模式等。也可能是由于某些隐藏参数的设置。
2.  对于重复记录的问题,v$sql_cs_selectivity视图的记录应该是以游标为单位的,但是如果有多个会话同时执行同一个SQL,那么可能会有多个相同的记录。这可能是由于Oracle的并发控制机制。
3.  对于游标失效的原因,BIND_EQUIV_FAILURE和ROLL_INVALID_MISMATCH的原因可能是相关的。可能是由于统计信息的变化导致的,也可能是由于某些隐藏参数的设置。
4.  对于统计信息的问题,你可以检查一下是否有定期收集统计信息的任务,或者是否有手动收集统计信息的操作。
5.  最后,这确实可能是一个BUG。你可以尝试升级Oracle版本。
以上只是我的一些想法,可能并不准确。

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
题主
2024-02-20
感谢回答。可以排除任何参数或者隐藏参数变动的原因,前端会话不会去设置这些。统计信息暂时也没找到除了数据库自动搜集以外,其它任何有人工搜集的迹象,总不能执行一次就搜集一次。目前我个人更倾向于是碰到了什么BUG。
周伟
2024-02-20

各位专家,这个问题非常有趣,期待你们的回答指导。

暂无图片 评论
暂无图片 有用 0
打赏 0
周伟
2024-02-21

实际观察发现,我大概率是碰到了个什么BUG,这个SQL在RAC环境下,表现为在1号节点无法游标共享,但2号节点却可以:

图片.png

有没有哪位专家解答呀。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏