通过12c的自动重新优化(Automatic Reoptimization 以后简称AR)功能, Oracle进一步的扩展和增强了11gR2版本的基数反馈(CFB)功能,来重新优化重复执行的SQL。
自动重新优化(AR)功能,主要包括两种形式的优化:
统计反馈(Statistics Feedback 以后简称SFB): 用于改善由于优化器估算的基数(cardinality )不准确导致的性能问题, 基本上是对基数反馈 (CFB)功能的增强。性能反馈(Performance Feedback 以后简称PFB): 主要用于改善并行度。
关于统计反馈(SFB)功能,让我们再回顾一下以前介绍的基数反馈 (CFB)功能。
CFB流程处理:
1. SQL文第一次执行时,Oracle会监控操作的实际行数(A-Row),然后对比CBO估算的行数(E-Row)。2. 如果两个值相差很大,就记录实际行数(A-Row),做上标记。 下次执行时再次进行硬解析,根据实际行数来重新生成执行计划。3. 如果两个值相差不大,CBO就不再监控这条SQL语句。
12c的统计反馈(SFB)功能和CFB功能流程以及实现原理都是相同,只是在一下几点得到了增强:
1.表连接的运行时统计信息(Join statistics)也会被收集和监控。2.和自适应游标共享(Adaptive Cursor Sharing)一起针对含有绑定变量的SQL也会有效。3.根据需要会生成SQL指令计划(SQL Plan Directives), 为下一次执行生成最优的执行计划而保存的一些指令和附加信息到字典表中。 用于当数据库重启或者被优化的SQL文从内存中Age-out后, 优化器依然意识到以前的反馈结果(实际行数和CBO估算的行数),在硬解析时进行动态采样等处理。4.在V$SQL视图中,追加了一个新的列IS_REOPTIMIZABLE, 用于指示SQL文在执行时实际行数和CBO估算的行数差别很大,需要在下一次执行时进行重新解析。
性能反馈(PFB)也和统计反馈(SFB)的处理流程十分相似。
CFB流程处理:
1. 如果参数PARALLEL_DEGREE_POLICY(默认值为MANUAL)被设为ADAPTIVE的情况下, SQL文第一次执行前,Oracle会首先根据现有的性能信息来预估一个并行度(记为DOP 1)。2. SQL文根据预估的并行度(DOP 1)进行执行,并在执行时监控操作的性能信息(如CPU时间等), 然后根据实际性能信息计算出一个新的并行度(记为DOP 2).3. Oracle会比较预估的并行度(DOP 1)和实际性能信息计算的并行度(记为DOP 2)。 如果两个值相差很大,就记录实际性能信息,并做上标记。4. 下次执行时再次进行硬解析,根据实际性能信息来重新决定并行度。5. 如果两个值相差不大,CBO就不再监控这条SQL语句。
参考: Database SQL Tuning Guide
Automatic Reoptimization