我正在努力确保我对CURSOR_SHARING,绑定变量,绑定变量偷看和直方图之间的关系有一个很好的理解,因为大多数来源涵盖这些主题是不同的部分。
好的,所以这就是我到目前为止收集到的内容,如果我有任何错误,请随意纠正我:
CURSOR_SHARING
1。 =完全(默认)
2。 = FORCE
相同的算法
3。 = SIMILAR
的问题:
根据我的理解,是不是使用CUSOR_SHARING = EXACT +用绑定变量(1.2)编写SQL语句导致与设置CURSOR_SHARING = FORCE(2.1)完全相同的结果?在这两种情况下,优化器只会在第一次运行时查看绑定变量以生成执行计划,然后重新使用该计划,无论后续运行时绑定变量的值是什么?如果是这样,为什么大多数消息来源建议使用绑定变量?这似乎会对性能产生重大影响。
初始绑定变量中使用的直方图是否为1.2和2.1?在第一次运行SQL语句并且优化器查看绑定变量时,是否使用直方图(如果有)确定是使用全表扫描还是索引扫描? “Oracle Database 11g,性能调优配方”似乎表明直方图仅在CURSOR_SHARING = SIMILAR时才相关,但其他一些来源也表明直方图也用于所有其他CURSOR_SHARING设置。
在1.1的情况下,优化器是否会使用直方图来确定最佳执行计划?基本上我只是想知道何时使用直方图。仅当CURSOR_SHARING = SIMILAR或其他CURSOR_SHARING设置好吗?
Adpative Cursor Sharing - 此功能仅在存在绑定变量时发生(来自用户查询或系统生成(通过文字替换))。因此它只发生在1.2,2.1,3.1和3.2?但由于SIMILAR已被弃用,这是否意味着ACS仅出现在1.2和2.1中?
希望我现在离基地不太远,但如果我犯了任何错误,请纠正我
谢谢!
编辑:BYS2于2011年12月20日下午12:11
答案 0 :(得分:11)
(使用绑定变量的另一个好处是它让你对SQL注入不太开放。)
2& 3.在为查询创建执行计划时,通常会使用直方图,而且这种方式比显而易见的更多。是的,在使用EXACT设置的标准绑定变量查询的情况下,优化程序在确定执行计划时使用直方图(或至少可以)。这可能是一件好事或坏事,具体取决于偏差以及您对绑定的特定价值。我认为您的来源对直方图和SIMILAR设置的观点是,在这种情况下,直方图的存在是导致创建新执行计划的触发器之一。
(我强烈推荐Jonathan Lewis的“基于成本的Oracle基础知识”,以获取关于何时以及如何使用直方图的所有信息。)
4 ..我相信自适应游标共享本质上是以前为CURSOR_SHARING = SIMILAR实现的逻辑的增强版本。在所有情况下,优化器都会考虑基于绑定变量查看创建新计划。 SIMILAR似乎仍然作为选项存在。 This post可能会提供一些有用的信息。