1. ACS简介

Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不该共享的游标被共享的可能性。ACS使用两个新指标:sensitivity and bindawareness来实施该特点。

2. ACS机制

2.1. Adaptive Cursor Sharing Metadata:Oracle 11g也提供了三个新视图和动态视图V$SQL的两个新列来允许DBA来确定优化器是否已经确定一个SQL语句为一个ACS的候选,并且,也可以通过它们来观察优化器分类SQL语句用以共享的执行计划所使用的业务规则:

视图

描述

V$SQL

Two new columns are added:

  • IS_BIND_SENSITIVE indicates if a SQL statement is bind-sensitive. If this column contains a value of (Y)es, it means that the optimizer peeked at the values of the statement’s bind variables so that it can calculate each predicate’s selectivity.Likewise, IS_BIND_AWARE indicates if the optimizer has also decided that the statement’s cursor is bind-aware after additional execution of the statement.

V$SQL_CS_HISTOGRAM

Distributes the frequency (within a three-bucket histogram) at which Oracle 11g used to decide if a SQL statement was bind-sensitive, including how many times a particular child cursor has been executed.

V$SQL_CS_SELECTIVITY

Contains information about the relative selectivity of a SQL statement’s predicates, including the predicates themselves, and their high and low value ranges. These values are also termed the cursor’s selectivity cube.

V$SQL_CS_STATISTICS

Lists the statistics of whether and/or how often an Adaptive Cursor has been shared. The PEEKED column will display a value of Y(es) if the bind set had been used to build the Adaptive Cursor.

表-1 ACS 视图

2.2. Bind Sensitivity:当带有绑定变量的SQL语句首次被解析时,在优化器窥探了绑定变量的值,并确定了语句谓词的相关选择率后,把该游标标记为 bind-sensitive(绑定敏感的)。期间也保留了这些敏感测量值,以便今后带有同样变量、不同值的同样语句再次执行时进行比较,看一个已经存在的执行计划是否能被新绑定变量值的语句利用。

2.3. Bind Awareness:一旦一个SQL语句的游标被标为 bind-sensitive,优化器也可以确定游标是bind-aware。通过检查随后执行的同样SQL语句绑定变量的值和所有匹配计划已被捕获的绑定变量的值,优化器完成这个步骤。如果优化器确定该语句能利用已存在的计划,那么,只需要更新游标执行柱状图来反应语句的执行即可。另外,如果绑定变量值足够不同,优化器也许决定创建一个新的子游标和执行计划。一旦这些发生,Oracle11g也把子游标的相关选择率存储到ACS元数据中。在游标随后的执行过程中,优化器比较存在的统计选择性数据和游标最近执行的统计数据,如果观察到大多数执行使用近似同样的选择性范围,那么,游标将会被标记为bind-aware。

当查询以一套超出一个已存在的bind-aware的游标绑定变量的选择率范围界限的不同的绑定变量值被执行时会发生什么呢?在该语句的硬解析期间,优化器也许仅仅决定扩展那个游标的选择率范围来包含新的变量值,通过产生一个合并两套绑定变量值的新游来做到这点。可见在必要的时候,也仅仅是增加了新游标。Oracle11g中,ACS特点默认被开启,且完全独立于CURSOR_SHARING参数。

2.4. 对SQLPlan Management (SPM)影响:最后,如果你了解古Oracle11g的SPM特点,你可能想知道ACS和SPM是否会相互影响,下面做一些简短的总结:

如果初始化参数OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES已被设置为TRUE来开启自动计划捕获,那么,带绑定变量的一个SQL语句将被标作对应的能用和可接受的执行计划。

如果同样语句的第二个执行计划被创建——对ACS特点来说这并不新鲜——那么,计划仅仅被增加到语句的计划历史里,但并能被立刻使用,因为SPM要求新执行计划首先被验证为一个较好的计划。

不幸的是,这意味着一个好的计划也许被忽视掉,哪怕是其游标的选择性范围可能会导致一个较好的性能。绕过该问题的一个很好的办法是保持自动计划捕获为默认设置False,接着把所有library cahce里的子游标都捕获到SMB里去。这将会迫使ACS产生的游标的所有计划都被标为SQL PLAN BASELINES。

3. 限制

Oracle11gR2为止,ACS特性存在以下限制(当以下场景出现时,会导致ACS不会把游标标记为bind sensitive):

扩展游标共享被关闭;

查询中没绑定变量;

某些参数被设置(例如:绑定变量窥探被置为flase);

语句正使用并行查询时;

语句使用了hints;

Outlines正被使用;

查询为递归查询;

绑定变量数超过14;

4. 关闭及开启

ACS默认情况下是开启的,为了关闭ACS,我们需要修改以下三个参数:

alter system set"_optimizer_extended_cursor_sharing_rel"=none;

altersystem set "_optimizer_extended_cursor_sharing"=none;

altersystem set "_optimizer_adaptive_cursor_sharing"=false;

为了开启ACS,我们需要修改以下四个参数:

_optim_peek_user_binds=true(一定要开启绑定变量窥视)_optimizer_adaptive_cursor_sharing=TRUE(以下三个参数默认开启ACS)_optimizer_extended_cursor_sharing=UDO

_optimizer_extended_cursor_sharing_rel=SIMPLE

5. 注意:

相关hint:Oracle11g中有个新的 hint,当使用此hint时,即使把ACS特性关掉,ACS特性在语句级依然会生效,该hint的语法为:/*+ BIND_AWARE*/;

关于Outlines:在Outlines存在的场景下,无论在系统级启用还是语句级通过hint启用,ACS都会失效;

6. 结论:

Oracle Database 11g的新特点ACS功能为带绑定变量的SQL语句执行计划高效共享提供了一个简单的方法。由于只有当绑定变量值选择率必要时,ACS也会产生一个新的执行计划,因此,共享游标的数目会保持最小。

转载自:https://www.2cto.com/database/201507/412888.html

Oracle ACS 绑定变量窥视 条件的更多相关文章

  1. Oracle 绑定变量窥视

    绑定变量窥视功能是数据库的一个特性,自ORACLE9i版本开始引入,默认是开启的. “绑定变量窥视”表示,查询优化器在第一次调用游标时,会观察用户定义的绑定变量的值,允许优化器来确认过滤条件的选择性, ...

  2. Oracle --获取绑定变量的值.

    SELECT * FROM DBA_HIST_SQLBIND WHERE SNAP_ID>67073 AND SNAP_ID<=67079 AND SQL_ID='3DR3410F086P ...

  3. oracle 使用绑定变量极大的提升性能

    初始化操作 SQL> alter system flush shared_pool; SQL> set timing on; 1. 未使用绑定变量的时候代码如下 declare type ...

  4. Oracle 数据库的绑定变量特性及应用

    Oracle 数据库的绑定变量特性及应用[-----]转载自https://www.cnblogs.com/rootq/(原地址) 关键词: 绑定变量(binding variable),共享池(sh ...

  5. Oracle SQL调优之绑定变量用法简介

    目录 一.SQL执行过程简介 二.绑定变量典型用法 2.1.在SQL中绑定变量 2.2.在PL/SQL中使用绑定变量 2.3.PL/SQL批量绑定变量 2.4.Java代码里使用绑定变量 最近在看&l ...

  6. PostgreSQL 绑定变量窥探

    今天我们要探讨的是 custom执行计划和通用执行计划.这一技术在 Oracle中被称为绑定变量窥视.但 Kingbase中并没有这样的定义,更严格地说,Kingbase叫做custom执行计划和通用 ...

  7. KingbaseES 绑定变量窥探机制

    概述: 对于数据严重倾斜的,极端如以下例子,不同的传入值,可能执行计划不同,制定执行计划时,就要求知道变量的值.对于绑定变量的情况,我们知道Oracle 有 _optim_peek_user_bind ...

  8. OTL翻译(5) -- otl_stream流相关绑定变量

    声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...

  9. otl_stream流相关绑定变量

    声明绑定变量 本章节将详细的说明如何在otl_stream流里面声明绑定变量. SQL语句.SQL语句块或存储过程在程序里面使用的时候总是带有占位符.OTL里面带有一个小的解析器用来解析这些占位符,并 ...

随机推荐

  1. Connection to api@localhost failed. [08001] Could not create connection to d

    pycharm 换成2019之后连接数据库用户名密码数据库名字都没错,就是连接不上去,网上百度一下,试试将URL后面拼接 ?useSSL=false&serverTimezone=UTC 发现 ...

  2. 深度探索MySQL主从复制原理

    深度探索MySQL主从复制原理 一 .概要 MySQL Replication (MySQL 主从复制) 是什么? 为什么要主从复制以及它的实现原理是什么? 1.1 MySQL 主从复制概念 MySQ ...

  3. Android--Facebook Login with LoginButton

    1.Layout文件添加Facebook的LoginBurtton <com.facebook.widget.LoginButton android:id="@+id/authButt ...

  4. Spring RestTemplate的使用示例

    @Bean注册一个RestTemplate: 调用服务: 因为要参与网络传输,所以要实现序列化接口:

  5. php 中header头的使用

    header("content-type:text/html;charset=utf-8");//页面字符集的设置 header("location:index.php& ...

  6. lombok使用教程

    Lombok介绍.使用方法和总结https://www.cnblogs.com/heyonggang/p/8638374.html Lombok简介.使用.工作原理.优缺点https://www.ji ...

  7. CCF 2016-04-1 折点计数

    CCF 2016-04-1 折点计数 题目 问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增 ...

  8. C# vb实现浮雕特效滤镜效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的浮雕效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  9. python实现scp功能

    最近公司有一个需求,需要把服务器A上的任务放到服务器B上,因为B上有HTTP,并且可以被外网访问,但是直接通过shell的scp,每次都需要输入密码.这里用python简单实现一下 直接上代码: im ...

  10. JS权威指南读书笔记(四)

    第十章 正则表达式 1 正则表达式直接量定义为包含在一对斜杠(/)之间的字符     a /s$/ == new RegExp("s$") 2 直接量字符:所有字母和数字都是按照字 ...