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

时间:2011-12-20 20:19:29

标签: oracle plsql oracle11g performance

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

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

CURSOR_SHARING

1。 =完全(默认)

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

    2。 = FORCE      

  • 2.1。优化器将用绑定替换所有文字 - 并且基本上将使用与场景1.2

    相同的算法

    3。 = SIMILAR      

  • 3.1。没有直方图:优化器用绑定替换所有文字 - >与1.2和2.1相同的最终效果      
  • 3.2。使用直方图: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中?

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

      谢谢!

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

  • 1 个答案:

    答案 0 :(得分:11)

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

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

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

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