概述
在 Oracle Database 12c Release 1 (12.1)之前版本,当打开这一特性(当这个表上没有统计信息时),动态统计信息在指定的采样级别上进行收集。
在 11gR2 上,采样级别在某种程度上可以被动态修改的。
从 Oracle Database 12c Release 1 (12.1)开始,如果动态统计信息被打开的话,那么优化器会自动的去决定:
1、是否动态统计信息是有用的
2、哪个采样级别被使用
打开自动动态统计信息
在 12c 上自动动态统计信息默认是启用的,OPTIMIZER_DYNAMIC_SAMPLING 默认值为2。当满足下面任一条件时自动动态统计信息将有效:
初始化参数 OPTIMIZER_DYNAMIC_SAMPLING 设置为默认值
或者
OPTIMIZER_DYNAMIC_SAMPLING 设置成11(如:默认值和11以外的值将关闭 ADS)
使用 SQL hint 启用动态统计信息
查询启用了并行
查询之前执行过,并且它的历史信息存在(来自 cursor cache, Automatic Workload Repository,或者 SQL Management Base)
在使用 Adaptive Query Optimization 技术时(如:Adaptive Plans,Statistics Feedback, SQL Plan directives 等等),优化器会基于算法决定是否使用动态统计信息。
在使用 Adaptive Query Optimization 时,触发 Automatic Dynamic Sampling
在下面的条件下使用 Adaptive Query Optimization 将触发自动动态采样:
当优化器发现 cardinality estimate 不准确时,ADS 将被触发(不管 SQL 语句是否是被重复执行的)
SQL 语句使用到了 adaptive plans 时,ADS 也会被触发
SQL 语句用到了自动重新优化(作为 adaptive statistics 一部分),ADS 也会被触发
关闭动态统计信息
通过设置参数 optimizer_dynamic_sampling 为0,或者使用 hint,可以关闭 ADS。
参数例子
execute immediate ‘alter session set optimizer_dynamic_sampling=0’;
hint 例子
关闭 SQL 语句中的所有表:
select /*+ dynamic_sampling(0) */ …
关闭 SQL 语句中某个表:
SELECT /*+ dynamic_sampling(<tab/alias name> 0) */
ADS 和 Sql Plan Directives 的注意事项
如果 OPTIMIZER_DYNAMIC_SAMPLING 大于等于 1 并且存在 DYNAMIC_SAMPLING 类型的 sql plan directives,动态采样将对新的查询起效,但是如果 OPTIMIZER_DYNAMIC_SAMPLING=0,那么即使存在 DYNAMIC_SAMPLING 类型的 sql plan directives ,动态采样也不会生效。