存储提纲与SQL计划基线

 存储提纲
   存储提纲被设计用来提供稳定的执行计划,以消除执行环境或者对象统计信息的改变造成的影响。因此,这个特性也被称作计划稳定性。具体的讲,存储提纲是一个提示的集合,更精确地说,所有这些提示强制查询优化器为一个给定的SQL语句,稳定地产生一个特殊的执行计划。但实践中,遗憾的是,即使使用存储提纲,还是可能观察到执行计划的改变。存储提纲不是总能提供一个稳定的执行计划,Oracle 11g自身就证实了这一点,从这个版本起,不再赞成使用存储提纲,而是推荐SQL计划基线。
   存储纲要的主要使用的情况:
       stored outline 就是把一个SQL语句的执行计划固定下来。比如说你SQL执行计划在测试库里运行很好,但是在生产库走了另外一个执行计划,可以把测试库的stored outline导出放到正式库中!让正式库的sql语句按照测试库的执行计划来走!
         1.为避免在升级后某些sql出现严重性能下降而且在短时间内不能优化的情况,我们可以使用outline的功能将原生产库中的sql执行计划实施在新的数据库上。
         2.为避免SQL的执行计划在统计数据不准确的情况(如未能及时收集表或索引的统计信息)下导致变化从而引起的性能降低。
         3.避免大规模分布实施的应用出现数据库版本、配置等区别引起的优化器产生不同的执行计划。
        4.某些Bug引起优化器生成较差的执行计划。在bug修复前我们可以使用outline来强制SQL的执行计划的正确。Outline的机制是将所需要的执行计划的hint保存在outline的表中。 当执行SQL时,Oracle会与outline中的SQL比较,如果该SQL有保存的outline,则通过保存的hint生成执行计划。
 Outline的使用注意事项
        1.Outln用户是一个非常重要的系统用户,其重要性跟sys,system一样。在任何情况下都不建议用户删除outln,否则会引起数据库错误。
        2.优化器通过Outline生成执行计划前提是outline内所有hint都有效的。如:索引没有创建的前提下,索引的hint是失效的,导致该SQL的outline计划不会被使用。
        3.参数Cursor_sharing=force时不能使用outline。
        4.literial sql的共享程度不高,Outline针对绑定变量的sql较好。针对literial sql的情况,需要每条sql都生成outline。
        5.创建outline需要有create any outline的权限。 
        6.要注意从CBO的角度来看,数据库表和索引的统计信息是随着数据量的变化而不断改变的。固定的执行计划在某些时段并不一定是最优的执行计划。所以outline的使用是要根据具体情况来决定的。
   Outline维护
         停止db使用outline功能:
               alter system set use_stored_outlines=false;
         disable/enable具体outline:
               alter outline ol_name disable;
               alter outline ol_name enable;
        删除:outline category: 
        outline相关视图:
              dba_outlines
              dba_outline_hints  该视图列出outline的hints内容 
        检查outline是否存在:
               select  name, category, owner from dba_outlines;

       SQL计划基线
        可以认为SQL计划基线是存储提纲的一个改进版本,事实上,SQL 计划基线不仅和存储提纲有许多相同的特性,而且也和存储提纲一样被设计用来提供稳定的执行计划,以防执行环境和对象统计信息的改变对执行计划产生影响。此外,和存储提纲类似,‘臼也可以在不修改语句的情况下调优应用程序。注意在Orade 文档中,维持执行计划的稳定性是SQL 计划基线唯一被提及的用途.由于某些未知的原因,对于也可以在不修改应用程序的情况下使用它来更改当前执行计划(涉及一条给定SQL 语句)的用法,并未提及。
SQL 计划基线是什么
        SQL计划基线是一个与SQL语句相关联的对象,它被设计用来影响查询优化器产生执行计划时的决定。具体地讲,SQL计划基线主要是一个提示的集合。基本上,SQL计划基线就是用来迫使查询优化器为一条给定的SQL语句产生个特定的、稳定的执行计划。
SQL计划基线的优点之一是它应用到一条特定的SQL语句,但在使用它的时候,SQL语句自身不需要进行修改。事实上,SQL计划基线存储在数据字典中,并且查询优化器会自动选择它们.首先,SQL语句以传统的方法执行换句话说,就是要杳询优化器在没有SQL计划基线支持的条件下产生执行计划。然后,对SQL语句进行标准化,使其不区分大小写而且不受空白的影响。为标准化后的SQL语句计算生成一个签名。然后,基于此签名查询数据字典。只要发现可接受的(信任的)并且又有相同签名的SQL计划基线可用,就检查它以确定要优化的SQL语句和此SQL计划基线所指的SQL语句是否一致。这一步十分必要,因为签名是一个哈希值,因此,有可能会发生哈希冲突。如果检测是成功的,SQL计划基线中的提示将被放入执行计划的生成过程里。注意:如果有多个可用的SQL计划基线,查询优化器会选择代价最小的那个。

捕获SQL计划基线
      有多种方法可用来捕获SQL计划基线。基本上,它们都是由数据库引擎自动创建或数据库管理员手动创建。下面的3 小节将分别介绍这3 种主要方法。
自动捕获
       当动态初始化参数optlmlzer_capture_sql_plan_baselines设置为true的时候,查询优化器将自动创建一个新的SQL计划基线。这个初始化参数被默认设置为FALSE,可以在系统级和会话级修改它。当自动捕获开启后,查询优化器为每条重复执行过(就是至少执行过两次)的SQL 语句存储一个新的SQL 计划基线。为此.它会将每条SQL 语句的签名插入一个日志中,以便于管理。这意味着当一条SQL语句第一次执行的时候,仅把它的签名插入日志。然后,当第二次执行相同的语句的时候,如果不存在与此语句相对应的SQL计划基线,就新建一个并存储起来。如果与SQL语句相对应的SQL计划基线已经存在,查询优化器仍然会对比当前的执行计划和基于此SQL计划基线的执行计划。如果它们不匹配,那么这个描述当前执行计划的新的SQL计划基线将被存储。然而就像你在前面见到的,不能直接使用当前的执行计划。查询优化器被强制使用在SQL 计划基线的辅助下产生的执行计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值