oracle - CURSOR_SHARING、绑定(bind)变量窥视和直方图之间的关系

标签 oracle plsql oracle11g performance

我试图确保我对 CURSOR_SHARING、绑定(bind)变量、绑定(bind)变量窥视和直方图之间的关系有一个很好的理解,因为大多数来源涵盖这些主题是不同的部分。

好的,这就是我到目前为止收集的内容,如果我有任何错误,请随时纠正我:

CURSOR_SHARING

1. = 精确(默认)

  • 1.1。如果 SQL 语句使用文字:优化器将为每个文字组合生成一个新的执行计划 - 优化器不会用绑定(bind)替换文字。为每个文字组合生成一个新的父游标。
  • 1.2.如果 SQL 语句使用绑定(bind)变量:第一次运行该语句时,优化器将查看绑定(bind)变量的值并使用这些特定值来生成执行计划 - 所有具有这些绑定(bind)变量的 future 语句都将使用相同的计划(甚至如果该计划对于绑定(bind)变量的其他值不是最优的)。

    2. = 强制
  • 2.1。优化器将用绑定(bind)替换所有文字 - 并且基本上使用与场景 1.2 相同的算法

    3. = 类似
  • 3.1。没有直方图:优化器用绑定(bind)替换所有文字 -> 最终效果与 1.2 和 2.1 相同
  • 3.2.使用直方图:optmizer 用绑定(bind)替换所有文字,但每次运行语句时都会查看绑定(bind)变量(而不是仅在第一次运行时),以查看对于绑定(bind)的特定值是否有更优化的执行计划变量(基于直方图统计)。因此,为优化器遇到的绑定(bind)变量的每个不同值有效地创建了一个新的子游标。

    问题:
  • 据我了解,使用 CUSOR_SHARING = EXACT + 使用绑定(bind)变量 (1.2) 编写 SQL 语句不会导致与设置 CURSOR_SHARING = FORCE (2.1) 完全相同的结果吗?在这两种情况下,优化器只会在第一次运行时查看绑定(bind)变量以生成执行计划,然后无论后续运行中绑定(bind)变量的值如何,都会重用该计划?如果是这样,那么为什么大多数来源建议使用绑定(bind)变量?这似乎会对性能产生重大影响。
  • 1.2 和 2.1 的初始绑定(bind)变量 peek 中是否使用了直方图?如第一次运行 SQL 语句并且优化器查看绑定(bind)变量时,它是否使用直方图(如果有)来确定是使用全表扫描还是索引扫描? “Oracle Database 11g,性能调优食谱”似乎表明直方图仅在 CURSOR_SHARING = SIMILAR 时才相关,但其他一些来源表明直方图也用于所有其他 CURSOR_SHARING 设置。
  • 在案例 1.1 中,优化器是否会使用直方图来确定最佳执行计划?基本上我只想知道何时使用直方图。仅当 CURSOR_SHARING = SIMILAR 或其他 CURSOR_SHARING 设置正常时?
  • 自适应光标共享 - 此功能仅在存在绑定(bind)变量(来自用户查询或系统生成(通过文字替换))时才会发生。因此它只发生在 1.2、2.1、3.1 和 3.2 中?但是由于 SIMILAR 已被弃用,这是否意味着 ACS 仅出现在 1.2 和 2.1 中?

  • 希望我现在离基地不太远,但如果我犯了任何错误,请纠正我

    谢谢!

    编辑:BYS2 2011 年 12 月 20 日 12:11 PM

    最佳答案

  • (a) 使用 FORCE 和 (b) 使用 EXACT 并自己编码绑定(bind)变量之间的区别在于,在后一种情况下,您可以控制何时使用绑定(bind)变量。因此,如果您可以看到在特定情况下绑定(bind)变量会损害性能,或者没有必要,您可以更改该查询。使用 FORCE,您将陷入困境。建议为 OLTP 类型查询绑定(bind)变量的原因是解析是一个高度序列化的过程,可能会成为一个很大的瓶颈。在 OLTP 系统中,您往往会看到许多本应始终使用相同执行计划的查询以不同的值运行,因此一直重新解析它们是一种浪费。任何好的来源也会建议您考虑何时不使用绑定(bind)变量——例如,如果您只有几个可能的值可以出现在查询中的特定位置,并且这些值中的一个或多个可能受益于不同的执行计划,总体而言使用文字可能会更好,因为您可以解析每个变体一次,然后重用缓存的计划。

  • (使用绑定(bind)变量的另一个好处是它可以减少对 SQL 注入(inject)的开放。)

    2 & 3. 在为查询创建执行计划时,通常会使用直方图,而且使用的方式比显而易见的要多。是的,在使用 EXACT 设置的标准绑定(bind)变量 peek 的情况下,优化器(或至少可能)使用直方图来确定执行计划。这可能是好事也可能是坏事,这取决于偏差和绑定(bind)的特定值。我认为您的消息来源关于直方图和 SIMILAR 设置的观点是,在这种情况下,直方图的存在是导致创建新执行计划的触发器之一。

    (我强烈推荐 Jonathan Lewis 的“基于成本的 Oracle 基础知识”,了解有关何时以及如何使用直方图的所有信息。)

    4.. 我相信自适应光标共享本质上是以前为 CURSOR_SHARING=SIMILAR 实现的逻辑的增强版本。在所有情况下,优化器都会考虑基于绑定(bind)变量窥视创建新计划。 SIMILAR 似乎仍然作为一个选项存在。 This post可能会提供一些进一步的有用信息。

    关于oracle - CURSOR_SHARING、绑定(bind)变量窥视和直方图之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8581413/

    相关文章:

    oracle - 提交前更改 Oracle SQL 查询文本

    c# - 获取项目索引(rownum)

    java - 如何在 JDBC 上执行这条 Oracle 语句

    sql - 递归连接计数 - Oracle

    oracle - 检查包装的 Oracle 包包含奇怪的十六进制并且无法解包

    Oracle:我可以以编程方式判断过程是否包含提交吗?

    sql - 使用 SQL 的时间表分配

    模拟不同的 SQL 查询

    sql - Oracle 中针对集合类型 'object' 进行批量收集

    sql - ORA-06502 : PL/SQL: numeric or value error: character string buffer too small