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. 基于Verilog HDL的超前进位全加器设计

    通常我们所使用的加法器一般是串行进位,将从输入的ci逐位进位地传递到最高位的进位输出co,由于电路是有延迟的,这样的长途旅行是需要时间的,所以为了加快加法器的运算,引入了超前进位全加器. 全加器的两个 ...

  2. python基础——匿名函数及递归函数

    python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...

  3. 处理异常、常用类、反射、类加载与垃圾回收、java集合框架

    异常处理概述 检查异常:检查异常通常是用户错误或者不能被程序员所预见的问题.(cheched) 运行时异常:运行时异常是一个程序在运行过程中可能发生的.可以被程序员避免的异常类型.(Unchecked ...

  4. PHP 抓取网页内容的几个函数

    <?php //获取所有内容url保存到文件 function get_index($save_file, $prefix="index_"){ $count = 68; $ ...

  5. java中关于&、&&、|、||之间的区别和运算

    关于&.&&.|.||之间的区别和运算 在逻辑运算中: 普通与&:要判断所有的判断的条件 短路与&&:如果前面一个判断条件出现false,则后续的判断条 ...

  6. R语言-美国枪杀案分析

    案例:该数据集的是一个关于美国2017年犯罪的一个数据集,接下来我们对该数据集进行分析 字段: #### S# :数据编号 #### Location:案件发生城市,州 #### Date:时间 ## ...

  7. java多线程的字符流与字节流

    字节流: package com.wz.thread.stream;import java.io.PipedOutputStream;/** * 字节输入流 * @author Administrat ...

  8. shell编程-项目部署(二)

    上节我们讲了项目部署的准备工作,现在具体讲下代码部署 首先梳理下思路,大致是这样: 获取代码 打包代码 传输代码 关闭应用 解压文件 放置文件(备份老文件,放置新的文件) 开启应用 最后检查下 OK, ...

  9. 机器学习技法:15 Matrix Factorization

    Roadmap Linear Network Hypothesis Basic Matrix Factorization Stochastic Gradient Descent Summary of ...

  10. mysql \N 的疑惑

    \N 在mysql查询为NULL 好像是可以代替成一个字符串,并与后面的单词隔绝,我的理解为下图这样 还是不懂为啥会这样.