<返回更多

Oracle中的基数反馈

2023-08-31    EmSpace
加入收藏

在第二次执行时,优化器会依据实际的基数重新决策生成执行计划,但是需要注意的是,当使用更准确的基数重新生成执行计划时,生成的执行计划与第一次时使用的执行计划完全有可能是相同的。这个技术的出现是由于优化器在一些情况下不能很好的去计算基数的数值,比如:统计信息缺失或陈旧、多谓词、直方图缺失等等。

报重庆思庄19c OCP周末班,送学习大礼包

Oracle只针对下面情况开启CFB:

① 没有收集表的统计信息,并且动态采样(Dynamic Sampling)也没有开启。

② 查询条件复杂(比如条件有函数)或者涉及多列,但却没有收集扩展的统计信息(Extended Statistics)。

在这几种情况下,CBO是无法估算出准确的Cardinality的。针对上述情况,Oracle会监控操作的实际行数(A-Row),然后对比CBO估算的行数(E-Row)。如果两个值相差很大,那么就记录实际行数(A-Row),做上标记。下次执行时再次进行硬解析,根据实际行数来重新生成执行计划。如果两个值相差不大,那么CBO就不再监控这条SQL语句。

Oracle 11gR2针对此特性,也专门在V$SQL_SHARED_CURSOR中增加了USE_FEEDBACK_STATS列来记录SQL是否使用了基数反馈。基数反馈的开启和关闭通过一个隐含参数“_OPTIMIZER_USE_FEEDBACK”来控制,该参数默认为TRUE,表示开启技术反馈特性。此参数除了可以在SESSION和SYSTEM级别进行设置之外,还可以在SQL语句级使用Hint进行开启和关闭,如下所示:

SELECT /*+ OPT_PARAM('_OPTIMIZER_USE_FEEDBACK' 'FALSE') */ COUNT(*) FROM TEST;

SELECT /*+ OPT_PARAM('_OPTIMIZER_USE_FEEDBACK' 'TRUE') */ COUNT(*) FROM TEST;

需要注意的是,如果动态采样被启用,那么是不会使用基数反馈特性的。若使用了该特性则在执行计划的Note部分可以看到“cardinality feedback used for this statement”字样。基数反馈在Oracle 12c上得到更进一步的扩展称为统计反馈(Statistics Feedback),并且成为Oracle 12c自动重新优化(Automatic Reoptimization)的一部分。但是由于CFB的评估结果数据只存在内存中(重启之后就会丢失),在会话之间是不可共用的,并且由于在Oracle 11g中存在过多的Bug,常见的问题就是在第二次执行SQL时候性能下降很多。因此在Oracle 11g的数据库中往往会对11.2.0.4以下的数据库会将该特性关闭。

关键词:Oracle      点击(6)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多Oracle相关>>>