甲骨文12 c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息

  
  

     

  

     

     

  
  

     

  虽然优化器需要准确的统计信息来选择最优的执行计划,但是有些场景下,收集统计信息比较困难,或消耗资源较高,或收集统计信息不能及时完成,那么就需要另一种备选策略。   

     

  不稳定的表   

     

  不稳定的表即随着时间的变化,数据会发生巨大变化的表,例如,一个订单队列表,一天的开始它是空的,随着时间推移,订单会填满这个表,一旦某一订单被处理又会从这个订单表中删除,一天的结尾表又会变为空。   

  

  如果你依赖于自动收集统计信息工作来维护这类表的统计信息,那么统计信息会经常显示此表为空。因为晚上此表是空的,而收集统计信息的工作也正是晚上才开始执行。然而,在白天的过程中,这个表可能有成百上千条记录只   

  

  在这种情况下,最好在表被填充时收集一组有的代表性的统计信息,并锁住,锁住统计信息会阻止自动收集的统计信息覆盖他们。另外,你可以依赖于动态采样来收集这些表的统计信息。优化器在优化一个语句之前编sql语译句的时候会使用动态采样来收集表的基本统计信息。尽管动态采样收集的统计信息没有完全由DBMS_STATS包收集的统计信息质量高,但在大多数情况下他们已经足够好了。   

     

  全局临时表   

     

  在应用程序上下文中,全局临时表经常被用于存储中间结果。全局临时表在系统级别与具有适当权限的所有用户共享其定义,但里面的数据内容在会话之间是相互独立和私有的。针对此表,直到有数据插入时才会分配物理存储。   

  

  一个全局临时表可以是事务特定的(提交时删除行记录),也可以是会话特定的(提交时保留行记录)。收集事务特定表的统计信息会导致此表被清空。相反,收集一个全局临时表的统计信息是可能的(会保留行记录),但是在之前的数据库版本这不是一个好方案,因为使用全局临时表的所有会话不得不共用同一组统计信息,以致于很多系统依赖于动态采样的统计信息。   

  

  然而,在oracle 12 c版本,现在可以实现每个使用全局临时表的会话拥有自己独立的统计信息。全局临时表上的统计信息是否共享取决于DBMS_STATS包的一个新选项GLOBAL_TEMP_TABLE_STATS。默认情况此选项设置为会话,即每个使用全局临时表的会话都有自己独立的统计信息。优化器会首先使用会话的统计信息,如果会话统计信息不存在,才会使用共享的统计信息。   

  

  甲骨文12 c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息”>
  </p>
  <p>
  ,
  </p>
  <p>
  如果你是从11 g升级到12 c,但数据库应用没有被修改去利用全局临时表的会话统计信息,你可能需要保持全局临时表默认的方式与升级之前一致,通过设置DBMS_STATS的GLOBAL_TEMP_TABLE_STATS选项为共享模式(或者至少等到应用被升级)。
  </p>
  <p>
  当使用直接路径的方式填充一个全局临时表(提交时保留行记录)时,在线统计信息收集会自动创建会话级别的统计信息,这将减少运行额外统计信息收集的必要性,也不会影响其他会话的统计信息。
  </p>
  <p>
  <img src=甲骨文12 c数据库优化器统计信息收集的最佳实践(三)|何时不需要收集统计信息