CURSOR_SHARING,Bind Variable Peeking和Histograms之间的关系

BYS*_*YS2 11 oracle performance plsql oracle11g

我正在努力确保我对CURSOR_SHARING,绑定变量,绑定变量偷看和直方图之间的关系有一个很好的理解,因为大多数来源涵盖这些主题是不同的部分.

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

CURSOR_SHARING

1. = EXACT(默认)

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

    2. = FORCE

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

    3. =类似

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

    问题:

    1. 根据我的理解,是不是使用CUSOR_SHARING = EXACT +用绑定变量(1.2)编写SQL语句导致与设置CURSOR_SHARING = FORCE(2.1)完全相同的结果?在这两种情况下,优化器只会在第一次运行时查看绑定变量以生成执行计划,然后重新使用该计划,无论后续运行时绑定变量的值是什么?如果是这样,为什么大多数消息来源建议使用绑定变量?这似乎可能会对性能产生重大影响.

    2. 初始绑定变量中使用的直方图是否为1.2和2.1?在第一次运行SQL语句并且优化器查看绑定变量时,是否使用直方图(如果有)确定是使用全表扫描还是索引扫描?"Oracle Database 11g,性能调优配方"似乎表明直方图仅在CURSOR_SHARING = SIMILAR时相关,但其他一些来源表明直方图也用于所有其他CURSOR_SHARING设置.

    3. 在1.1的情况下,优化器是否会使用直方图来确定最佳执行计划?基本上我只是想知道何时使用直方图.是仅当CURSOR_SHARING = SIMILAR或其他CURSOR_SHARING设置好吗?

    4. Adpative Cursor Sharing - 只有存在绑定变量时才会发生此功能(来自用户查询或系统生成(通过文字替换)).因此它只发生在1.2,2.1,3.1和3.2?但由于SIMILAR已被弃用,这是否意味着ACS仅出现在1.2和2.1中?

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

    谢谢!

    编辑:BYS2于2011年12月20日下午12:11

  • Dav*_*sta 11

    1. (a)使用FORCE和(b)自己使用EXACT和编码绑定变量之间的区别在于,在后一种情况下,您可以控制何时使用绑定变量.因此,如果您可以看到在特定情况下绑定变量会损害性能,或者不是必需的,您可以更改该查询.有了FORCE,你就被困住了.为OLTP类型查询推荐绑定变量的原因是解析是一个高度序列化的进程,可能成为一个巨大的瓶颈.在OLTP系统中,您往往会看到许多查询应该始终使用以不同值运行的相同执行计划,因此始终重新解析它们是一种浪费.任何好的来源还会建议您考虑何时不使用绑定变量 - 例如,如果您只有一些可能出现在查询中特定位置的可能值,并且这些值中的一个或多个可能会受益于不同的执行计划,使用文字可能会更好,因为您可以解析每个变体一次,然后重用缓存的计划.

    (使用绑定变量的另一个好处是它使您对SQL注入的开放性降低.)

    在创建查询的执行计划时,通常使用直方图,并且以比明显更多的方式使用.是的,在使用EXACT设置的标准绑定变量查询的情况下,优化程序在确定执行计划时使用直方图(或至少可以).这可能是一件好事或坏事,具体取决于偏差以及您对绑定的特定价值.我认为你的来源对直方图和SIMILAR设置的观点是,在这种情况下,直方图的存在是导致创建新执行计划的触发器之一.

    (我强烈推荐Jonathan Lewis的"基于成本的Oracle基础知识",以获取关于何时以及如何使用直方图的所有信息.)

    4 ..我相信自适应游标共享本质上是以前为CURSOR_SHARING = SIMILAR实现的逻辑的增强版本.在所有情况下,优化器都会考虑基于绑定变量查看创建新计划.SIMILAR似乎仍然作为选项存在. 这篇文章可能会提供一些有用的信息.