Oracle12c中的自动重优化

Oracle12c中的自适应查询优化有一系列不同特点组成。像自适应计划(AdaptivePlans)功能可以在运行时修改执行计划,但并不允许计划中连接顺序的改变。自动重优化基于先前执行和反馈到优化器信息的学习,因此,语句下次解析执行时将会生成一个较好的计划。

1.   统计信息反馈(势反馈)

势反馈(Cardinalityfeedback)在Oracle11r2中被引进。当优化器产生一个执行计划时,统计信息缺失、统计信息陈旧、复杂谓词或复杂操作等也许会触发优化器监视计划中各个操作的势。一旦执行完成,如果评估和实际势之间差别较大,实际势将会被存在SGA中以备今后使用,且该语句也被标作可重优化。该语句下次执行时会采用存储的势来进行重优化,以便采用较好的计划。势反馈是语句确定的,且实例重启或共享池中的语句陈旧时会丢失。Oracle12c中,势反馈已经重命名为统计信息反馈。

--注:

1)   统计信息反馈相关信息在SGA中作为V$SQL_REOPTIMIZATION_HINTS 视图中的OPT_ESTIMATE hints 存储。该视图和hints未被归档。

1.1.  示例

下面的代码创建一个管道表函数,通过它说明统计信息反馈

CONN test1/test@pdb1

-- 创建支持表函数的类型

DROP TYPE tp_tf_tab;

DROP TYPE tp_tf_row;

CREATE TYPE tp_tf_row AS OBJECT (

id           NUMBER,

description  VARCHAR2(50)

);

/

CREATE TYPE tp_tf_tab IS TABLE OF tp_tf_row;

/

-- 创建表函数.

CREATE OR REPLACE FUNCTION f_tab_pl (p_rows IN NUMBER) RETURN tp_tf_tabPIPELINED AS

BEGIN

FOR i IN 1 .. p_rows LOOP

PIPE ROW (tp_tf_row(i,'Description for ' || i));

END LOOP;

RETURN;

END;

/

我们知道,优化器总是基于数据库块大小来评估管道表函数的势,因此,我们希望得到该管道函数查询势的一个错误评估。下面的查询返回10行数据,但优化器评估出了8168行,这显然是错误的。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM TABLE(f_tab_pl(10));

SET LINESIZE 200 PAGESIZE 100

SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstatslast'));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------------

SQL_ID  0ktmsgvczysxy, child number0

-------------------------------------

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM TABLE(f_tab_pl(10))

Plan hash value: 822655197

-------------------------------------------------------------------------------------------------

| Id  | Operation                         | Name        | Starts | E-Rows | A-Rows |   A-Time  |

-------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |             |      1 |       |     10 |00:00:00.01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH|F_TAB_PL    |      1 |  8168 |     10 |00:00:00.01 |

-------------------------------------------------------------------------------------------------

SQL>

检查视图列V$SQL.IS_REOPTIMIZABLE显示优化器已经探测到了不正确的势评估并把该语句标示为将被重新优化。

COLUMN sql_text FORMAT A50

COLUMN is_reoptimizable FORMAT A16

SELECT sql_text, is_reoptimizable

FROM   v$sql

WHERE  sql_text LIKE '%f_tab_pl%'

AND    sql_text NOT LIKE '%v$sql%';

SQL_TEXT                                          IS_REOPTIMIZABLE

-------------------------------------------------- ----------------

SELECT /*+ GATHER_PLAN_STATISTICS */       * FROM Y

TABLE(f_tab_pl(10))

SQL>

如果再次运行该语句,我们将看到更精确的一个势评估,且有个注意部分告诉我们采用了统计信息反馈。同时,也注意到子游标号也发生了改变。

SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM   TABLE(f_tab_pl(10));

SET LINESIZE 200 PAGESIZE 100

SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format => 'allstatslast'));

PLAN_TABLE_OUTPUT

-------------------------------------------------------------------------------------------------

SQL_ID  0ktmsgvczysxy, child number1

-------------------------------------

SELECT /*+ GATHER_PLAN_STATISTICS */       * FROM

TABLE(f_tab_pl(10))

Plan hash value: 822655197

-------------------------------------------------------------------------------------------------

| Id  | Operation                         | Name        | Starts | E-Rows | A-Rows |   A-Time  |

-------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |             |      1 |       |     10 |00:00:00.01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH|F_TAB_PL    |      1 |    20 |     10 |00:00:00.01 |

-------------------------------------------------------------------------------------------------

Note

-----

- statistics feedback used forthis statement

SQL>

--注:

1)   11Rr2版本中,注意部分将会是"cardinality feedbackused for this statement"。

2)   文档中也提到,势的错误评估也会导致生成SQL计划指令(SQLplan directives) ,但不要误以为统计信息反馈被保留在SQL计划指令中。我们可以通过如下语句查询SQL计划指令是否存在。

CONN sys@pdb1 AS SYSDBA

EXEC DBMS_SPD.flush_sql_plan_directive;

SET LINESIZE 200

COLUMN dir_id FORMAT A20

COLUMN owner FORMAT A10

COLUMN object_name FORMAT A10

COLUMN col_name FORMAT A10

SELECT TO_CHAR(d.directive_id) dir_id, o.owner, o.object_name,

o.subobject_name col_name,o.object_type, d.type, d.state, d.reason

FROM   dba_sql_plan_directives d,dba_sql_plan_dir_objects o

WHERE  d.directive_id=o.directive_id

AND    o.owner = 'TEST'

ORDER BY 1,2,3,4,5;

no rows selected

SQL>

2.   性能反馈(Performance Feedback)

Oracle 11gR2引进了PARALLEL_DEGREE_POLICY初始化参数用以简化并行查询。该参数默认值为MANUAL,当被设置为AUTO时,能使并行度确定,语句排队和内存内并行执行自动化。

Oracle 12cR1为该参数增加了ADAPTIVE设置,该值类似于AUTO,但包括了性能反馈。这种情况下,优化器决定语句是否并行运行和合适的并行度。当完成时,会对语句的实际性能和初始优化阶段的评估性能进行对比。如果两者间差别很大,则实际性能统计信息被存储为统计信息反馈,且语句也被标为可重新优化的。当该语句下次被执行时,统计信息反馈会被用来选择一个更合适的并行度(DOP)。

--注:

1)   从Oracle 11gR2向后,语句中的PARALLEL hint将导致系统自动选择并行度,而不管PARALLEL_DEGREE_POLICY设置为什么值。

3.   统计信息反馈和SQL计划指令(相互作用)

该部分大多基于我对统计信息反馈的经验推测。先前我们做测试的语句并不会保存为SQL计划指令。统计信息反馈指示优化器已经做了不好的选择,这些选择一般是因为确定执行计划时缺失重要的信息。统计信息反馈能被用于重优化,但它并不解决最初的问题。基本统计信息还是不具有代表性。

SQL计划指令是“额外提示”,能阻止优化器在将来犯同样的错误。在有些场景,自动重优化也会导致生成SQL计划执行,但这并不包括统计信息反馈和性能反馈,而是执行动态采样来解决短期内偏离问题,因此,不再需要统计信息反馈。

由于SQL计划指令影响DBMS_STATS包未来收集统计信息的方式,因此,通过为基础统计信息添加另外的信息(扩展统计信息),它有能力从根本上解决问题,从而使不再需要SQL计划执行和统计信息反馈。一个需要统计信息反馈的场景也许会生成SQL计划指令,但那并不意味着SQL计划指令包含统计信息反馈的一个可保留版本。

当统计信息反馈和SQL计划指令因势错误评估而都被创建时,在两者间有些很有意思的相互作用:

Ø 两者都被在SGA中创建但SQL计划指令还未被保留到SYSAUX表空间的场景中,统计信息反馈在重优化期间被使用,期间忽视SQL计划指令的存在。

Ø 两者都被创建但SQL计划指令被保留到SYSAUX表空间的场景,SQL计划指令在重优化期间被使用,统计信息反馈也可能被使用。

由于SQL计划指令仅仅被周期性的保留,这意味着依赖于SQL语句第一次和第二次执行间时间的长短,最后的重优化可能是完全不同的,这导致结果的不可预测。

Oracle12c中SQL性能优化(SQL TUNING)新特性之自动重优化(automatic reoptimization)的更多相关文章

  1. Oracle12c中数据删除(delete)新特性之数据库内归档功能

    有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已.这种需求通常通过如下方法实现: 1)  给相关表增加一个另外的列,该列存储标志数据被删除的标记. 2)  给 ...

  2. 黑马程序员_Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

    ------- android培训.java培训.期待与您交流! ---------- 首先来看一段代码: Integer x = new Integer(4); Integer y = 4; 在JD ...

  3. jdk1.5新特性之-----自动装箱与自动拆箱

    import java.util.ArrayList; /* jdk1.5新特性之-----自动装箱与自动拆箱. java是面向对象 的语言,任何事物都可以使用类进行描述,sun就使用了 一些类描述j ...

  4. PHP7中我们应该学习会用的新特性

    PHP7于2015年11月正式发布,本次更新可谓是PHP的重要里程碑,它将带来显著的性能改进和新特性,并对之前版本的一些特性进行改进.本文小编将和大家一起来了解探讨PHP7中的新特性. 1. 标量类型 ...

  5. 分享ES6中比较常用又强大的新特性

    前言 es6有很多新东西,但是感觉常用的并不是很多,这里学习记录了一些我自己认为非常常用又强大的新特性. scoping 实用的块级作用域,let x = xxx 可以声明一个块级作用域的局部变量,简 ...

  6. jdk8中关于操作集合的一些新特性,遍历和排序操作

    jdk8增加了不少新的东西,在集合操作这块,就有如 lamda表达式,stream,sort,optional等新的类,主要涉及遍历和排序等方面,新特性提升了不少性能,我们开发就是要拥抱新事物,守着老 ...

  7. VS2015中C#版本6.0的新特性

    [z]http://www.cnblogs.com/xszjk/articles/6417173.html [z]https://www.cnblogs.com/qixu/p/6047229.html ...

  8. Oracle 12C 新特性之在线重命名、迁移活跃的数据文件

    Oracle 数据库 12c 版本中对数据文件的迁移或重命名不再需要太多繁琐的步骤,可以使用 ALTER DATABASE MOVE DATAFILE 这样的 SQL 语句对数据文件进行在线重命名和移 ...

  9. 工作中使用的html5和css3 新特性

    1.placeholder <input type="text" placeholder="请输入手机号码" class="phone" ...

随机推荐

  1. JS中的递归

      递归基础 递归的概念 在程序中函数直接或间接调用自己 直接调用自己 简介调用自己 跳出结构,有了跳出才有结果 递归的思想 递归的调用,最终还是要转换为自己这个函数 如果有个函数foo,如果他是递归 ...

  2. CSS 选择器简介

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 选择器权重 如果以4位数表示选择符权重,那么: 元素选择器的权重是1: id 选择器的权重为100: cl ...

  3. Terminal,git,vim常用命令整理以及删除本地git仓库

    Terminal常用命令 目录操作 ll 打开目录列表 ls -a 打开目录下所有文件列表 cd 切换到某目录 mkdir 创建目录 rmdir 删除空目录 rm -rf 目录名字 强制删除目录 mv ...

  4. ubuntu安装mysql并修改编码为utf-8

    参考地址:ubuntu中文 sudo apt-get install mysql-server mysql-client -y # 中途会要求输入一下root用户的密码 编辑/etc/mysql/co ...

  5. Python系列之 - 字符编码问题

    1.内存和硬盘都是用来存储的. CPU:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编 ...

  6. ●BZOJ 2839 集合计数

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2839 题解: 容斥原理 真的是神题!!! 定义 f[k] 表示交集大小至少为 k时的方案数怎 ...

  7. 【LA 3027 Corporative Network】

    ·一些很可爱的询问和修改,放松地去用并查集解决. ·英文题,述大意: 输入n(5<=n<=20000)表示树有n个节点,并且会EOF结束地读入不超过 20000个操作,一共有两种:    ...

  8. SpringBoot跨域问题解决方案

    一.允许全部请求跨域许可的代码: 需要继承WebMvcConfigurerAdapter类 @Configuration public class MyWebAppConfigurer extends ...

  9. Git常用命令及常见问题解决

    $ mkdir xxx       ----创建xxx目录 $ cd learngit     ----切到xxx目录下 $ pwd               ----查看当前文件所在目录 $ gi ...

  10. 非Unicode编码的软件如何在Windows系统上运行

    我们常常会遇到这样一种情况:点开某些日文软件(我不会说就是galgame( ╯□╰ ))会出现乱码或者直接无法运行. 出现乱码的原因很简单:编码与译码的方式不一致!!!!!!!!!!! 首先大家需要知 ...