当前位置: 首页 > news >正文

oracle11g中SQL优化(SQL TUNING)新特性之Adaptive Cursor Sharing (ACS)

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.cnblogs.com/claireyuancy/p/7061715.html

相关文章:

  • 浅析JAVA内部类
  • 将字符串按照单词完全反转---公司面试题
  • UI教程
  • 我想要的是什么,我真的清楚吗?
  • Java数据类型(2)------自动封装拆箱
  • Java实现排序算法(一)
  • JMS 之 Active MQ 的spring整合
  • Java实现排序算法(二)
  • vue项目实战爬坑小记001
  • Java实现排序算法(三)
  • Java通信编程之Socket入门
  • 回车提交表单
  • 数据库的查询优化技术
  • 微信jssdk分享功能,jssdk成功调用,分享内容自定义失败
  • 用VS2005制造WEB安装程序
  • Google 是如何开发 Web 框架的
  • SegmentFault for Android 3.0 发布
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【知识碎片】第三方登录弹窗效果
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Brief introduction of how to 'Call, Apply and Bind'
  • ES6 学习笔记(一)let,const和解构赋值
  • Js基础知识(四) - js运行原理与机制
  • python学习笔记 - ThreadLocal
  • SQLServer之创建数据库快照
  • 回顾 Swift 多平台移植进度 #2
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 在weex里面使用chart图表
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • kubernetes资源对象--ingress
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • #FPGA(基础知识)
  • #pragma预处理命令
  • #每天一道面试题# 什么是MySQL的回表查询
  • (23)Linux的软硬连接
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (理论篇)httpmoudle和httphandler一览
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)3D模板阴影原理
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NetCore部署微服务(二)
  • .NET建议使用的大小写命名原则
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • 。Net下Windows服务程序开发疑惑
  • @angular/cli项目构建--http(2)
  • @EnableWebMvc介绍和使用详细demo
  • []新浪博客如何插入代码(其他博客应该也可以)