好的,所以这里是我收集到目前为止,如果我有任何错误,请自由太过正确我:
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.使用直方图:optmizer用绑定替换所有文字,但是在绑定变量上查看语句是否运行(与第一次运行相反),以查看是否存在绑定的特定值的更优化的执行计划变量(基于直方图统计).因此,为优化器遇到的绑定变量的每个不同值有效地创建一个新的子游标.
问题:
>从我的理解来看,没有使用CUSOR_SHARING = EXACT使用bind-variables(1.2)编写sql语句导致与设置CURSOR_SHARING = FORCE(2.1)完全相同的结果?在这两种情况下,优化器只会在第一次运行时窥视绑定变量来生成执行计划,然后重新使用该计划,而不管后续运行中绑定变量的值如何.如果是这样,那么为什么大多数来源建议使用绑定变量?这似乎可能会对性能产生重大影响.
>在初始绑定变量中使用的直方图是否窥视1.2和2.1?如同第一次运行sql语句并且优化器在绑定变量上看到的是否使用直方图(如果有的话)来确定是否使用全表扫描或索引扫描? “Oracle数据库11g,性能调优配方”似乎表明直方图仅在CURSOR_SHARING = SIMILAR时有关,但其他一些来源表示直方图也用于所有其他CURSOR_SHARING设置.
>在1.1中,优化器会使用直方图来确定最佳的执行计划吗?基本上我只想知道直方图何时被使用.是只有当CURSOR_SHARING = SIMILAR或其他CURSOR_SHARING设置好吗?
>适应光标共享 – 仅当存在绑定变量(从用户查询或系统生成(通过文字替换))时,此功能才会发生.因此,它只发生在1.2,2.1,3.1和3.2中?但由于SIMILAR已被弃用,这是否意味着ACS仅发生在1.2和2.1?
希望我现在不是太远,但如果我犯了错误,请纠正我的意见
谢谢!
作者:BYS2于2011年12月20日12:11 PM
(使用绑定变量的另一个好处是它使您不太可以使用sql注入.)
2&在为查询创建执行计划时,通常使用直方图,而且在更多的方面比显而易见.是的,在标准绑定变量窥视EXACT设置的情况下,优化器在确定执行计划时使用直方图(或至少可能).这可能是一件好事,也可能是一件坏事,这取决于你的束缚和什么特定的价值.我想你的消息来源是关于直方图的点,而SIMILAR设置是在这种情况下,直方图的存在是导致新的执行计划被创建的触发器之一.
(我强烈建议乔纳森·刘易斯的“基于成本的Oracle基础知识”,了解您可能想要使用直方图的所有信息.)
4 ..我相信自适应光标共享本质上是以前为CURSOR_SHARING = SIMILAR实现的逻辑的增强版本.在任何情况下,优化器将考虑基于绑定变量窥视创建新的计划. SIMILAR似乎仍然存在作为选项. This post可能会提供一些更有用的信息.