暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

自动动态统计信息

原创 刘旭 2020-06-12
1898

概述
在 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 ,动态采样也不会生效。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论