关于计划的稳定性与控制

      oracle的基于成本的优化器(CBO)最令人郁闷的一点就是它看上去可能会不定期地改变SQL语句的执行计划的趋势。当然,这些改变并不是完全随机的。但因为优化器代码太复杂了,通常很难来确定执行计划为什么改变了。在多年以前oracle就已经认识到了这个问题,并至少在过去的10年中一直努力进行改善。他们提供了很多工具来识别执行计划在什么时候发生了改变以及为什么改变。同时他们还提供了很多工具允许你在不同层次上对优化器所选择的执行计划进行控制。

  • 计划不稳定性

      它的工作本质上就是计算出获取SQL语句指定的特定数据集的最快方法。一般来说,这必须使用预先计算好的关于所含对象的统计信息来在非常短的时间内完成。优化器通常没有时间来验证这些信息。之所以有这么紧的时间约束是因为解析是一个串行运算。因此,数据库需要尽可能少做,并尽可能快速完成;否则,解析可能会成为可扩展性的一个严重的瓶颈。那么执行计划为什么会改变呢?CBO的主要输入有3个:

  • 统计信息——与SQL语句所引用的对象相关
  • 环境——例如与优化器相关的参数设置
  • SQL——语句本身

      因此,除非上面3点中的某一个改变了,否则执行计划是不应该变化的。我相信计划不稳定性导致的挫败感主要是由于我们认为任何事情都没有变化,而实际上某些事情的确发生了变化。

  • 执行计划控制
  1. 调整查询结构
  2. 适当使用常量
  3. 给优化器一些提示

      统计信息的变化和绑定变量窥视是引起计划不稳定的最主要原因 。说来也怪,统计信息的更新没有跟上数据的变化是导致执行计划稳定的另一个常见原因。但是在这三个方面中,绑定变量窥视可能是最广泛也是最难对付的原因。尽管大多数用户并不十分情愿关闭绑定变量窥视特性,这一点是可以理解的,但将它完全关闭实际上是可行的选择。有很多生产系统都采用了这种方法。例如,SAP标准配置的一部分就是将_optim_peek_user_binds参数设置为false(关闭 绑定变量窥视参数) 。这可能会阻止优化器对于某一系列的查询选择绝对意义上的最优执行计划,但却得到了更具一致性的环境。除了将绑定变量关闭以外,在需要直方图信息处理偏态数据分布的列上恰当使用常量,实际上是在处理计划稳定性问题的同时,还能使得优化器具有选择绝对最优执行计划能力的唯一有效途径。注意:关闭绑定变量窥视不会影响是用cbo还是rbo,就算关闭了绑定变量窥视,cbo还是会利用别的统计信息(num_distinct,density等)来评估cost和cardinality,只是无法使用直方图信息而已

猜你喜欢

转载自mukeliang.iteye.com/blog/1721642