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也会产生一个新的执行计划,因此,共享游标的数目会保持最小。

oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)的更多相关文章

  1. Oracle 11g 新特性 -- 自适应游标共享(Adaptive Cursor Sharing: ACS) 说明(转载)

    一.自适应游标共享(Adaptive Cursor Sharing) 说明 1.1 ACS概述绑定变量使Oracle DB 可以为多条SQL 语句共享单个游标,以减少分析SQL 语句所使用的共享内存量 ...

  2. SQL Server 2014 BI新特性(一)五个关键点带你了解Excel下的Data Explorer

    Data Explorer是即将发布的SQL Server 2014里的一个新特性,借助这个特性讲使企业中的自助式的商业智能变得更加的灵活,从而也降低了商业智能的门槛. 此文是在微软商业智能官方博客里 ...

  3. 【数据库】 SQL SERVER 2014 实用新特性

    [数据库] SQL SERVER 2014 实用新特性 官方链接 一. 内存优化表 大幅提高数据库性能,不过目前没有窗口化设计只能写语句 二. 索引增强

  4. 【数据库】 SQL SERVER 2012 实用新特性

    [数据库] SQL SERVER 2012 实用新特性 官方链接 一. ALWAYS ON - 灾难恢复 二. 列存储索引 - 比非聚集索引效率高,但有索引表不允许修改数据(插入,更新,删除),用于读 ...

  5. SQL Server 2012 T-SQL 新特性

    序列 Sequence SQL Server 现在将序列当成一个对象来实现,创建一个序列的例子语法如下: CREATE SEQUENCE DemoSequence START WITH 1 INCRE ...

  6. SQL Server 2012 管理新特性:AlwaysOn 可用性组

    SQL Server 2012 新特性(一)管理新特性:AlwaysOn 一.准备环境 1.准备4台计算机 域控制器DC1,IP地址192.168.1.1 主节点SQL1:IP地址192.168.1. ...

  7. MySQL5.7中InnoDB不可不知的新特性

    讲师介绍  赖铮 Oracle InnoDB团队 Principle Software Developer 曾任达梦.Teradata高级工程师,主要负责研发数据库执行引擎和存储引擎,十年以商数据库内 ...

  8. 面试题: 数据库 sql优化 sql练习题 有用 学生表,课程表,成绩表,教师表 练习

    什么是存储过程?有哪些优缺点? 什么是存储过程?有哪些优缺点? 存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL.T-SQL). 存储过程的优点: 能够将代码封装起来 保存在数据库之 ...

  9. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

随机推荐

  1. c++ sleep(windows/linux)

    c标准中包含了一个sleep用以实现当前线程暂停执行n毫秒,如下所示: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); ...

  2. Python3基础 list 推导式 生成与已知列表等长度+元素为0的列表

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  3. Python3基础 file for+list 读取txt文本 并 一行一行的输出(低效率)

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  4. 【第十三章】 springboot + lombok

    lombok作用:消除模板代码. getter.setter.构造器.toString().equals() 便捷的生成比较复杂的代码,例如一个POJO要转化成构建器模式的形式,只需要一个注解. 注意 ...

  5. UVa 12174 Shuffle(滑动窗口)

    https://vjudge.net/problem/UVA-12174 题意: 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个1~n的排列,然后就按这个排列顺序播放歌曲.播放完 ...

  6. 下列java代码中的变量a、b、c分别在内存的______存储区存放。

    class A{ private String a = "aa"; public boolean methodB(){ String b = "sb"; fin ...

  7. 微信小程序之可滚动视图 scroll-view 的使用注意

    微信小程序之可滚动视图 scroll-view 使用注意: 1.scroll-view 中的需要滑动的元素不可以用 float 浮动: 2.scroll-view 中的包裹需要滑动的元素的大盒子用 d ...

  8. hdu 1788 最小公倍数(这题面。。。)

    Chinese remainder theorem again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  9. testNG 学习笔记 Day 3 常用的断言

    TestNG中最常用的一个断言类是Assert.java,里面有多个静态方法,这个类我们习惯叫硬断言.对应的还有一个软断言的类,叫SoftAssert.java,这个类是需要创建实例对象,才能调用相关 ...

  10. SQLServer 中的SYSPROCESSES表

    性能测试的时候对SQLserver DB中的CPU,io,内存进行监控 可以通过系统进程表查看资源使用情况 注意要有master权限 select top 10 * from SYSPROCESSES ...