1 Adaptive Query Plans 特性说明
adaptive plans 是 Oracle 12c 中引入的新特性,官网对该特性的说明如下:
https://docs.oracle.com/database/121/TGSQL/tgsql_optcncpt.htm#TGSQL94982
https://docs.oracle.com/database/121/TGSQL/tgsql_influence.htm#TGSQL257
MOS 的文章:
Adaptive Execution Plans (Doc ID 1409636.1)
Adaptive Query Optimization (Doc ID 2031605.1)
Oracle Database 12c 版本1的自适应特性的建议 (Adaptive Features, Adaptive Statistics 以及 12c SQL 性能) (Doc ID 2297986.1)The ability of the optimizer to adapt a plan, based on information learned during execution, can greatly improve query performance.
Adaptive plans are useful because the optimizer occasionally picks a suboptimal default plan because of a cardinality misestimate. The ability to adapt the plan at run time based on actual execution statistics results in a more optimal final plan. After choosing the final plan, the optimizer uses it for subsequent executions, thus ensuring that the suboptimal plan is not reused.
自适应特性,是指优化器基于之前执行结果的相关信息,在下次相关 SQL 的执行阶段调整执行计划和重新生成执行计划的一组功能。它能够使SQL在第一次运行时根据运行时统计信息动态改变最终的执行计划,用于避免SQL语句在第一次执行时由于差的执行计划引起灾难性的性能问题。
执行计划自适应分为两个组件:
- 自适应执行计划 - 允许优化器在 SQL 执行阶段改变执行计划。
- 自适应统计信息 - 允许优化器基于之前执行结果的信息,重新生成执行计划。这些信息有些是固化到数据字典中的,例如:SQL Plan Directives 或者自动生成的扩展统计信息。
在 12.1 版本里,两个组件被同一个参数 optimizer_adaptive_features控制,默认值是 TRUE.
在 12.2 中参数 optimizer_adaptive_features 被废弃,自适应特性被两个参数控制, optimizer_adaptive_plans 和 optimizer_adaptive_statistics。
- 参数 optimizer_adaptive_plans 控制是否启用自适应执行计划特性,即允许优化器在 SQL 执行时动态调整执行计划,默认值是 TRUE。
- 参数optimizer_adaptive_statistics 控制是否启用自适应统计信息功能,该参数默认是FALSE。自动扩展统计信息是被表级的属性 AUTO_STAT_EXTENSIONS控制的,默认是 OFF. (AUTO_STAT_EXTENSIONS 可以使用 DBMS_STATS 的 SET_TABLE_PREFS 以及 SET_GLOBAL_PREFS来设置。)
2 关闭特性
自适应特性的出发点是好的,但同其他新特性一样,当前在 19c 版本中 Oracle 并没有完全调教好,开启自适应的执行计划可能会导致执行计划的不稳定。
所以在 19c 中建议关闭该特性,通过optimizer_adaptive_plans 参数控制,
OPTIMIZER_ADAPTIVE_PLANS:
Control adaptive plans.
By default, this parameter is true, which means that adaptive plans are enabled.
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/OPTIMIZER_ADAPTIVE_PLANS.html
操作示例:
SQL> show parameter 'optimizer_adaptive_plans';
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
optimizer_adaptive_plans boolean
TRUE
SQL> alter system set optimizer_adaptive_plans=false scope=both;
System altered.
SQL> show parameter 'optimizer_adaptive_plans';
NAME TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
optimizer_adaptive_plans boolean
FALSE
SQL>
版权声明:本文为博主原创文章,未经博主允许不得转载。