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

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


这个问题可能是由于Oracle数据库的自适应游标共享特性引起的。在Oracle 19c中,自适应游标共享特性可以根据查询的选择性动态地改变游标的共享方式。这意味着,对于相同的SQL语句,Oracle可能会生成多个不同的游标,每个游标都有不同的执行计划。
在你的情况下,可能是由于查询的选择性发生了变化,导致Oracle生成了新的游标。即使这些游标的LOW/HIGH范围与前面的游标完全相同,但由于查询的选择性发生了变化,Oracle可能会选择一个不同的执行计划,因此需要生成新的游标。
另外,v$sql_cs_selectivity视图中的重复记录可能是由于多个会话同时执行相同的SQL语句引起的。每个会话都会在视图中生成一个记录,因此可能会出现重复的记录。
如果你想避免这种情况,可以考虑关闭自适应游标共享特性,或者使用绑定变量来避免查询的选择性发生变化。


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


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


