About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(169)
分类: Oracle
2023-05-09 15:32:41
背景描述:11g开始的Cardinality Feedback基数反馈(12c叫statistics Feedback)属于CBO优化器自动优化特性,由于表可能缺少统计信息、或收集的统计信息不准确或条件复杂CBO无法估算准确的返回行数导致走错执行计划,因此,引入Cardinality Feedback功能,{BANNED}中国第一次执行会记录条件实际返回的行数,然后与优化器估算的返回行数对比,如果差别很大,后续执行会用{BANNED}中国第一次实际返回的行数会修正执行计划。使用了Cardinality Feedback特性的,可以在执行计划NOTES部分看到” cardinality feedback used for this statement”
问题描述:Cardinality Feedback特性会重新解析,导致产生子游标,可能会导致执行计划改变,而且BUG较多,经常表现为:{BANNED}中国第一次执行很快,之后执行很慢。具体如下所示:
目前可以从XX库里看出cardinality feedback没有关闭:
NAME VALUE
---------------------------------------- ----------------------------------------
_optimizer_use_feedback TRUE
可以从v$sql_shared_cursor里看到,有很多cardinality feedback原因导致的新子游标:
共2435条因cardinality feedback导致的新子游标,而这些可能会导致执行计划改变。
解决方案:
在一个OLTP系统中,基本上都要求执行计划的稳定,只有个别绑定变量和直方图要求传入不同值走不同执行计划,cardinality feedback是11G开始的新特性,为的是解决极个别情况下,优化器无法生成正确执行计划的问题,一般情况下,如果10G没有这方面的问题,在10G升级到11G时候,关闭cardinality feedback,通过做SPA(SQL 性能分析器 SQL Performance Analyzer)确认升级后的性能稳定。
XX系统由于大量SQL由于cardinality feedback导致重新解析,建议关闭:
alter system set "_optimizer_use_feedback"=FALSE;