使用Oracle动态采样改善数据库优化器性能

日期: 2013-10-31 作者:Matthew Morris翻译:冯昀晖 来源:TechTarget中国

Oracle动态采样可以改善数据库优化器决策。该功能自Oracle 9i R2起发布已经有很长时间,但其设计初衷仍然经常被误解误用。 Oracle优化器是基于存储在数据字典中的统计信息做决策的,该字典中存储了给定查询语句需要引用的对象。如果没有有效的统计数据,在选择执行计划时优化器通常没有太多选择。

Oracle动态采样的主要功能之一就是提供给了优化器处理这种情况的一种手段。 事实上,该功能可以动态收集统计数据,这给人一种错误的印象,认为有了动态采样就不需要存储统计信息了。事实上并非如此。首先,动态采样收集的统计信息并不是与DBMS_STATS包收集的信息一样全面。

其次,收集信息的行为会影响SQ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Oracle动态采样可以改善数据库优化器决策。该功能自Oracle 9i R2起发布已经有很长时间,但其设计初衷仍然经常被误解误用。

Oracle优化器是基于存储在数据字典中的统计信息做决策的,该字典中存储了给定查询语句需要引用的对象。如果没有有效的统计数据,在选择执行计划时优化器通常没有太多选择。Oracle动态采样的主要功能之一就是提供给了优化器处理这种情况的一种手段。

事实上,该功能可以动态收集统计数据,这给人一种错误的印象,认为有了动态采样就不需要存储统计信息了。事实上并非如此。首先,动态采样收集的统计信息并不是与DBMS_STATS包收集的信息一样全面。其次,收集信息的行为会影响SQL操作的性能开销。Oracle动态采样是常规统计的补充,而不是代替常规统计。

在执行计划生成期间,如果优化器遇到有的表缺少统计信息,有限的统计信息组就可以被动态收集作为解析操作的一部分。然而,要注意,优化器不会执行远程表或外部表的动态采样。即时查询涉及引用的对象统计信息都存在,也可能由于复杂谓词引起优化器执行动态采样。如果优化器确定需要使用动态采样,Oracle将发起递归SQL来扫描表块少量随机采样。

除了所使用的样本大小外,“OPTIMIZER_DYNAMIC_SAMPLING”级别设置还决定了触发Oracle动态采样的条件。作为一般规则,Oracle推荐保持这个参数的默认设置为“系统级别”,只有在必要时再把它改为“会话级别”。在大多数情况下,修改这个参数也无法使数据库中的所有SQL语句获益。

下面是“OPTIMIZER_DYNAMIC_SAMPLING”参数的级别和含义:

  • 0——不使用动态采样。
  • 1——对所有未经分析的表采用32块样本大小采用动态采样,但只有未分析的表有超过32块且没有索引也没有分区时才符合条件。
  • 2——如果语句中至少有一个表没有统计信息,则使用64块样本的动态采样。这个设置是默认值。
  • 3——如果语句满足“2”的标准,或者在“WHERE”从句谓词中使用了一个或者更多表达式,则使用64块样本大小的动态采样。
  • 4——如果语句满足“3”的标准或者使用了复杂谓词(比如在同一个表的多个谓词之间使用“OR”或者“AND”操作符),则使用64块样本大小的动态采样。
  • 5-9——如果语句满足“4”的标准,分别采用128、256、512、1024或者2048块样本大小的动态采样。
  • 10——对所有语句使用所有块动态采样。

在Oracle数据库中,动态采样服务的对象主要是在数据仓库中少量运行时间较长的查询语句,把“OPTIMIZER_DYNAMIC_SAMPLING”参数值级别设置改为“3”或“4”可以极大提升查询的整体性能。这是因为动态采样的开销会被更优的执行计划所抵消。然而,在OLTP环境中,有大量快速运行的查询语句,增加解析时间开销可能会降低整体性能。在这种环境下,把这个参数保持原始默认值“2”通常是明智的选择。在这两种情况下,理解动态采样如何工作是SQL调优过程的重要部分。“DYNAMIC_SAMPLING”提示还可以用于对单个语句激活动态采样。至于一般的提示,主要是用于测试,而不建议广泛使用在生产环境中。

对于有复杂谓词的SQL语句,Oracle动态采样为谓词选择提供了更准确的预估。这反过来又有助于创建更好的执行计划。动态采样可以补充一些统计信息,包括表和索引块技术,表技术和连接列的统计。

对于给定语句,优化器决定是否使用动态采样的一个重要因素就是,该语句是串行执行还是并行执行。串行操作通常使用更少的系统资源,执行时间也较短。收集统计信息带来的开销对性能可能有负面影响,而不是正面的。对于并行查询的,创建执行计划要分配更多资源,这是降低完成SQL操作整体时间的绝好机会。优化器对串行操作总会遵守“OPTIMIZER_DYNAMIC_SAMPLING”级别设置。然而,对于并行操作,如果这个级别设置的是默认值,同时该SQL语句还使用了复杂谓词,那么优化器可能会选择激活动态采样了。如果“OPTIMIZER_DYNAMIC_SAMPLING”级别设置的不是默认级别,尽管语句运行在并行方式,Oracle会遵守分配的级别。在这两种情况下,如果现存统计缺失、不可用或者不够了,数据库都将执行动态采样(除非动态采样完全关闭)。

不是所有的查询都可以通过Oracle动态采样加速。执行时间非常快的查询和不需要重复的临时查询都不适合使用动态采样。下面这些情况都可以从动态采样中得到最大收益:

  • 含有会产生不良执行计划的谓词的查询。
  • 执行语句的时间比执行动态采样的时间要长很多。
  • 需要在数据库中重复执行的查询。

相关推荐

  • Oracle专家调优秘密(二)

    如何调整Oracle的竞争?怎样总结表格和索引存储参数设置的要求?本文对上述两个问题进行了详细说明。

  • Oracle专家调优秘密(一)

    在这篇简介中,我们将简要地介绍以下的Oracle主题:外部调整;Row re-sequencing以减少磁盘I/O;Oracle SQL调整;调整Oracle排序;调整Oracle的竞争等等这些方面的内容。