深入理解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定义的所有表,同时对表的所有数据进行动态采样
采样的数据块越多、得到的分析数据就越接近于真实,但同时伴随着资源的消耗也就越大