查询估计--直方图用于估计选择代价

原创
2015/10/23 12:47
阅读数 200

#查询估计--直方图用于估计选择代价 ##工程的总体位置

使用嵌套循环的方法查询代价见下方:

比如要估计两张表的连接操作的代价,则有如下方法; joincost(t1 join t2) = scancost(t1) + ntups(t1) x scancost(t2) + //IO cost ntups(t1) x ntups(t2) //CPU cost

估计一张表中的某一个等式的选择率

##Why直方图?

  • 相关代码文件IntHistogram.java
  • 直方图统计的是选择到符合指定op的值的情况下v值的概率
  • 如果不用直方图估计的话将意味着每次选择比如属性大于某值的元组有多少的时候都需要遍历整张表才能得到这个值,这效率太低。
  • 如果有直方图只需要用总的记录数*某不等式的选择率就可以估计到表中某个指定的属性满足条件不等式的记录数

##统计方法如下:

  • 1、对表的每一个属性(如果是string类型的则转换成int值得类型)建立一张数字直方图
  • 2、需要传入3个参数:要分成的桶的数目buckets、某列属性的最大和最小值,注意范围是min <= v < max,所以扫描一遍表的所有记录求出最大和最小值以后需要在最大值处+1,然后在做成直方图。而且在对每一个属性做最大和最小真实记录扫描的时候要把前面属性记录下来的最大最小值刷新,以免影响后面的计算结果(因为在类里面实现的时候用的是公共属性)
  • 3、在估计选择率的时候要注意边界,min能取到,max不能取到;所以对等于max的情况选择率是0。同时需要排除掉多种特殊情况,这些情况下得到的统计值都是0.0或1.0
  • 有关每个bucket的宽度,程序在实现的时候用的是不等宽直方图,但是不等宽的原因是比如有0到32的范围,但是要分到100个buckets里面,由于宽度都是整型数值类型,所以要么是1要么是0,所以在建立直方图的时候需要保证所有整型数字比如中值16所在的bucket宽度不能是0,故使用了另一个变量来记录bucket的左边界
  • 5、统计公式如图所示:

计算selectivity

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部