Cardinality Feedback on Oracle 11.2.0.1
Cardinality Feedback on Oracle 11.2.0.1
Oracle Database - 11.2.0.1
概述
Cardinality Feedback 基数反馈是版本 11.2(11.2.0.1 及以后)中引入的关于 SQL 性能优化的新特性,该特性主要针对统计信息陈旧、无直方图或有直方图但仍基数计算不准确的情况,Cardinality 基数的计算直接影响到后续的 JOIN COST 等重要的成本计算评估,造成 CBO 选择不当的执行计划。Cardinality Feedback,本质上就是一种基于自适应模型的执行计划调整机制。当对一个 SQL 语句,第一次生成执行计划之后,其计算的成本 cost 是依据估算出的 cardinality 得出的。当执行这个计划后,Oracle 就会得到真正这个 SQL 的执行计划结果,并且用真实的结果集合来更新执行计划中的 Cardinality。在第二次生成时候,就可以使用更加真实的结果来确定了。在 Oracle 11g 中,Cardinality Feedback 功能默认开启,控制参数是一个隐含参数_optimizer_use_feedback。
查询隐含参数的设置:
col KSPPINM for a40 |
开启条件
① 没有收集表的统计信息,并且动态采样(Dynamic Sampling)也没有开启。
② 查询条件复杂(比如条件有函数)或者涉及多列,但却没有收集扩展的统计信息(Extended Statistics)。
注意目标表上的过滤条件里有绑定变量时不会启用基数反馈,有了绑定变量就会使用自适应游标共享特性了。
关闭特性
可能需要关闭的情况:
① 一条诡异的 SQL,从执行第二次开始,执行计划发生变化,导致执行效率极低,最终影响核心业务系统的正常运行。
② 一条 SQL 第一遍查询 1 秒左右能出来,不改任何地方,再次查询却需要 50 秒左右,随便修改条件值,或者换个注释,再查还是 1 秒能查出来,再次执行又是 50 秒左右才出来。
如果通过从 shared pool 中抽取出来的执行计划是不一样的,而且性能低下的使用了 Cardinality Feedback 可以考虑关闭特性。
SELECT * FROM TABLE(dbms_xplan.display_cursor('&SQL_ID',&cursor_child_no)); |
这种应该是 Oracle11g Cardinality Feedback 的 bug,11.2.0.4 好像已经得到改善。关闭参数:
alter system set "_optimizer_use_feedback"=false scope=both; |