在 Oracle 12c当中,优化器的一个新特性就是提供了新类型的柱状图数据,Top-N频率柱状图和混合柱状图。优化器利用它们可以更加高效、精确地计算执行计划代价,选择最优计划。这里我将探究一下混合频率柱状图在什么情况下获得、以及它如何影响优化器的选择率的计算。
12c 在线文档描述:
混合柱状图结合了高平衡柱状图和频率柱状图两者的特性。“取双方之所长”使得优化器在某些情况下获得最可靠的选择率估算值。
简单的说,混合柱状图的引入是为了解决高平衡柱状图的问题。
首先我们回顾一下高平衡柱状图的选择率计算:
* 如果是非“流行”值,
selectivity=NewDensity
=(非流行数值数据数)/(非流行数值数)/(非空数值数据数)
=((ssize-nv)-(ssize-nv)*PopBktCnt/BktCnt)/(NDV-PopValCnt)/(ssize-nv)
=((ssize-nv)(1-*PopBktCnt/BktCnt))/(NDV-PopValCnt)/(ssize-nv)
=((BktCnt-PopBktCnt)/BktCnt)/(NDV-PopValCnt);
* 如果是“流行”数据但不是最大值。
selectivity=PopBktNum/BktCnt;
* 如果是“流行”数据且是最大值。
selectivity=(PopBktNum-0.5)/BktCnt;
而产生高平衡柱状图的过程也不复杂:
* 分组大小限制为唯一值的分组平均记录数;将数值按顺序分别放入分组当中。分别记录下当前的分组累计大小和数值数据累计数量;
* 如果当前分组大小足够容纳当前数值数据,则该数值被分入最后一个分组,并继续比较下一数值;
* 如果当前分组大小不足以容纳当前数值数据,则将该数值分配至下一分组;并且,如果此时的分组累计大小和数值数据累计数量之间的差值大于一个分组大小,则需要分配多个分组,且该值为“流行”值;
* “流行”值之后的值则会被分入新的分组;
按照高平衡柱状图的选择率计算方法,“流行”值和非“流行”值之间的差别会比较大。而由其产生过程来看,一个“流行”值可能仅有稍大于一个分组大小数据量,但因为其之间的分组仅剩余少量空间导致其被认为是一个“流行”值;而一个非“流行”值可能含有接近于两个分组大小数据量,但因为其正好被分配给空的分组,使得其不被认为是“流行”数值。这两种数值计算得到的选择率将与它们实际的选择率相差甚远。
我们看一个示例,