日期:2014-05-16  浏览次数:20415 次

深入理解Oracle优化器(3):动态采样
       动态采样的统计信息不会记录到视图,有时候分析过的表也会参与评估
       对CBO有效,因为RBO不需要统计信息,所以动态采样没意义
       
       ㈠ 动态采样的作用
          
          ① 10G开始,RBO彻底退出了历史舞台,CBO依赖的是充分的统计分析信息
             但是并不是每个用户都会非常认真、及时地去对每个表做分析
             为了保证执行计划都尽可能正确,Oracle需要使用动态采样技术来帮助CBO获得尽可能多的信息
             
          ② 全局临时表。通常而言,临时表的数据是不做分析的、因为它存放的数据是临时的、可能很快就释放
             但是当一个查询关联到这样的临时表时、CBO要想获得临时表上的统计信息,也只能依赖于动态采样
             
          ③ 动态采样除了可以在段对象没有分析时,给CBO提供分析数据之外,还有一个独特的能力
             它可以对不同列之间的相关性做统计
             
       ㈡ 动态采样的缺点
          
          ● 采样的数据块有限,对于海量数据的表,难免有偏差
          ● 采样会消耗系统资源,特别是OLTP尤其不推荐使用动态采样
          
       ㈢ 动态采样的级别
          
          ① level 0
             
             不做动态采样
             
          ② level 1
             
             CBO对没有分析的表进行动态采样,但需要同时满足以下4个条件:
             
             ● SQL中至少有一个未分析的表
             ● 未分析的表出现在关联查询或者子查询中
             ● 未分析的表没有索引
             ● 未分析的表占用的数据块要大于动态采样默认的数据块(32个)
             
          ③ level 2
             
             对所有的未分析表做分析,动态采样的数据块是默认数据块的2倍
             
          ④ level 3
             
             采样的表包含level 2定义的所有表,同时包括,哪些谓词有可能潜在地需要动态采样的表
             这些表动态采样的数据块为默认数据块;对没有分析的表,动态采样的数据块为默认数据块的2倍
             
          ⑤ level 4
             
             采样的表包含level 3定义的所有表,同时还包括一些表,WHERE字句引用了两个或多个字段的表
             这些表动态采样的数据块为默认数据块;对没有分析的表,动态采样的数据块为默认数据块的2倍
             
          ⑥ level 5、6、7、8、9
             
             采样的表包含level 4定义的所有表,同时分别使用动态采样默认数据块数的2、4、8、32、128倍的数量来做动态采样
             
          ⑦ level 10
             
             采样的表包含level 9定义的所有表,同时对表的所有数据进行动态采样
             

          采样的数据块越多、得到的分析数据就越接近于真实,但同时伴随着资源的消耗也就越大