4.4.2自适应统计
当查询谓词过于复杂而不能仅依赖基表统计信息时,优化器可以使用自适应统计信息。默认情况下,自适应统计信息处于禁用状态(OPTIMIZER_ADAPTIVE_STATISTICS is false)。
4.4.2.1动态统计
动态统计信息是一种优化技术,其中数据库执行一个递归SQL语句以扫描表块的随机样本以估计谓词基数。
在SQL编译期间,优化器通过考虑可用统计信息是否足以生成最佳计划来决定是否使用动态统计信息。如果可用统计信息不足,那么优化器将使用动态统计信息来扩充统计信息。为了提高优化程序决策的质量,优化程序可以将动态统计信息用于表扫描,索引访问,联接和GROUP BY操作。
4.4.2.2自动重新优化
在自动重新优化中,优化器在初始执行后更改后续执行的计划。
自适应查询计划不适用于各种计划更改。例如,具有低效连接顺序的查询可能性能欠佳,但是自适应查询计划不支持在执行过程中调整连接顺序。在SQL语句的第一次执行结束时,优化器使用执行期间收集的信息来确定自动重新优化是否具有成本优势。如果执行信息与优化程序的估计差异很大,则优化程序将在下一次执行时寻找替换计划。
优化器使用在先前执行期间收集的信息来帮助确定替代计划。优化器可以多次重新优化查询,每次都收集其他数据并进一步改进计划。
自动重新优化采用以下形式:
- 重新优化:统计信息反馈 :一种称为统计信息反馈(以前称为基数反馈)的重新优化形式可自动改进针对基数被错误估计的重复查询的计划。
- 重新优化:性能反馈重新优化的 :另一种形式是性能反馈。这种重新优化有助于提高自动选择的时候重复SQL语句的并行度
PARALLEL_DEGREE_POLICY设置为ADAPTIVE。
4.4.2.2.1重新优化:统计信息反馈
重新优化的一种形式称为统计信息反馈(以前称为基数反馈),可以自动改进针对基数被错误估计的重复查询的计划。
优化器可能由于多种原因而错误地估计基数,例如缺少统计信息,不准确的统计信息或复杂的谓词。使用统计信息反馈进行重新优化的基本过程如下:
- 在第一次执行SQL语句期间,优化器将生成一个执行计划。
在以下情况下,优化器可以启用监视共享SQL区域的统计信息反馈的功能:
- 没有统计信息的表
- 一张表上的多个合取或合取过滤谓词
- 谓词包含优化器无法准确计算选择性估计值的复杂运算符
- 在第一次执行结束时,优化器将其初始基数估计值与执行期间计划中每个操作返回的实际行数进行比较。
如果估算值与实际基数有显着差异,则优化器将存储正确的估算值以供后续使用。优化器还会创建一个SQL计划指令,以便其他SQL语句可以从此初始执行过程中获得的信息中受益。
- 如果查询再次执行,则优化器将使用校正后的基数估计值代替其通常的估计值。
在OPTIMIZER_ADAPTIVE_STATISTICS初始化参数不控制自动重新优化的所有功能。特别是,此参数仅在自动重新优化的情况下控制对连接基数的统计信息反馈。例如,设置OPTIMIZER_ADAPTIVE_STATISTICS为FALSE禁用联接基数错误估计的统计信息反馈,但不禁用单表基数错误估计的统计信息反馈。
示例4-3统计信息反馈
本示例说明了数据库如何使用统计信息反馈来调整不正确的估计。
- 用户
oe运行的以下查询orders,order_items和product_information表:SELECT o.order_id, v.product_name FROM orders o, ( SELECT order_id, product_name FROM order_items o, product_information p WHERE p.product_id = o.product_id AND list_price < 50 AND min_price < 40 ) v WHERE o.order_id = v.order_id - 在光标中查询计划显示,估计的行(
E-Rows)远少于实际的行(A-Rows)。-------------------------------------------------------------------------------------------------- | Id | Operation | Name |Starts|E-Rows|A-Rows|A-Time|Buffers|OMem|1Mem|O/1/M| -------------------------------------------------------------------------------------------------- | 0| SELECT STATEMENT | | 1| | 269 |00:00:00.14|1338| | | | | 1| NESTED LOOPS | | 1| 1 | 269 |00:00:00.14|1338| | | | | 2| MERGE JOIN CARTESIAN| | 1| 4 |9135 |00:00:00.05| 33| | | | |*3| TABLE ACCESS FULL |PRODUCT_INFORMATION| 1| 1 | 87 |00:00:00.01| 32| | | | | 4| BUFFER SORT | | 87| 105 |9135 |00:00:00.02| 1|4096|4096|1/0/0| | 5| INDEX FULL SCAN |ORDER_PK | 1| 105 | 105 |00:00:00.01| 1| | | | |*6| INDEX UNIQUE SCAN |ORDER_ITEMS_UK |9135| 1 | 269 |00:00:00.04|1305| | | | -------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - filter(("MIN_PRICE"<40 AND "LIST_PRICE"<50)) 6 - access("O"."ORDER_ID"="ORDER_ID" AND "P"."PRODUCT_ID"="O"."PRODUCT_ID") - 用户
oe在步骤1中重新运行查询。 - 在光标中查询计划表明,优化器
Note在第二次执行时使用了统计信息反馈(如所示),并且还选择了另一个计划。-------------------------------------------------------------------------------------------------- |Id | Operation | Name | Starts |E-Rows|A-Rows|A-Time|Buffers|Reads|OMem|1Mem|O/1/M| -------------------------------------------------------------------------------------------------- | 0| SELECT STATEMENT | | 1| | 269 |00:00:00.05|60|1| | | | | 1| NESTED LOOPS | | 1|269| 269 |00:00:00.05|60|1| | | | |*2| HASH JOIN | | 1|313| 269 |00:00:00.05|39|1|1398K|1398K|1/0/0| |*3| TABLE ACCESS FULL |PRODUCT_INFORMATION| 1| 87| 87 |00:00:00.01|15|0| | | | | 4| INDEX FAST FULL SCAN|ORDER_ITEMS_UK | 1|665| 665 |00:00:00.01|24|1| | | | |*5| INDEX UNIQUE SCAN |ORDER_PK |269| 1| 269 |00:00:00.01|21|0| | | | -------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("P"."PRODUCT_ID"="O"."PRODUCT_ID") 3 - filter(("MIN_PRICE"<40 AND "LIST_PRICE"<50)) 5 - access("O"."ORDER_ID"="ORDER_ID") Note ----- - statistics feedback used for this statement在前面的输出中,
269步骤1中的估计行数()与实际行数匹配。
4.4.2.2.2重新优化:性能反馈 (自动并行)
重新优化的另一种形式是性能反馈。这种重新优化有助于提高自动选择的时候重复SQL语句的并行度PARALLEL_DEGREE_POLICY设置为ADAPTIVE。
使用性能反馈进行重新优化的基本过程如下:
- 在第一次执行SQL语句期间,如果
PARALLEL_DEGREE_POLICY将设置为ADAPTIVE,则优化程序将确定是否并行执行该语句,如果是,则确定使用哪种并行度。优化器根据语句的估计性能选择并行度。为所有语句启用了附加性能监视。
- 在初始执行结束时,优化器将比较以下内容:
- 优化器选择的并行度
- 根据实际执行该语句期间收集的性能统计信息(例如,CPU时间)计算的并行度
如果两个值相差很大,则数据库会将语句标记为要重新分析,并将初始执行统计信息存储为反馈。该反馈有助于更好地计算并行度以用于后续执行。
- 如果查询再次执行,那么优化器将使用在初始执行期间收集的性能统计信息来更好地确定语句的并行度。
注意:
即使PARALLEL_DEGREE_POLICY未设置为ADAPTIVE,统计信息反馈也可能会影响为语句选择的并行度。
4.4.2.3 SQL计划指令
一个SQL计划指令,在附加信息,优化程序使用,以产生更优化的方案。
该指令是优化程序的“自我提示”,它错误地估计了某些类型谓词的基数,并且还提醒DBMS_STATS您收集将来纠正错误估计所需的统计信息。
例如,在查询优化期间,当确定表是否为动态统计信息的候选者时,数据库会在统计信息存储库中查询表上的指令。如果查询联接的两个表的联接列中都有数据偏斜,则SQL计划指令可以指示优化器使用动态统计信息来获取准确的基数估计。
优化器在查询表达式而不是语句级别上收集SQL计划指令,以便可以将指令应用于多个SQL语句。优化器不仅可以自我纠正,还可以记录有关错误的信息,以便即使从共享池中清除了查询(以及任何类似的查询)之后,数据库也可以继续纠正其估计值。
数据库自动创建指令,并将其存储在SYSAUX表空间中。您可以使用PL / SQL包更改,保存到磁盘和传输指令DBMS_SPD。
也可以看看:
- “ SQL计划指令 ”
- “ 管理SQL计划指令 ”
- Oracle Database PL / SQL软件包和类型参考以了解该
DBMS_SPD软件包
4.4.2.4启用自适应统计信息 参数
默认情况下禁用自适应统计信息。
设置以下初始化参数时,将启用自适应统计信息:
OPTIMIZER_ADAPTIVE_STATISTICS是TRUE(默认值为FALSE)OPTIMIZER_FEATURES_ENABLE是12.1.0.1或以后
设置OPTIMIZER_ADAPTIVE_STATISTICS为TRUE启用以下功能:
- SQL计划指令
- 加入基数的统计反馈
- 自适应动态采样
注意:
设置OPTIMIZER_ADAPTIVE_STATISTICS为FALSE保留单表基数估计错误的统计信息反馈。
也可以看看:
- “ 控制自适应优化 ”
- Oracle数据库参考以了解更多信息
OPTIMIZER_ADAPTIVE_STATISTICS




