基数估计的问题定义和意义
有时候我们也需要对不止一个表的复杂查询(包含多表连接(join)、范围查询(range query)等)估计基数,这些都是数据库基数估计的研究内容。
基数估计的作用主要可概括成如下两个方面:
(1)基数估计是数据库查询优化的重要一环。由于子查询的基数代表了中间结果的大小,因此现有的大多数基于代价的查询优化技术对子查询计划代价的估计强烈依赖对子查询基数的估计。一个优秀的基数估计模型能帮助优化器更好地选择合适的执行计划。
(2)基数估计可以帮助回答一些只需要知道结果数量的查询。例如某个用户可能想知道全中国有多少大学生学习计算机专业,这个查询只关心结果的数目而不需要知道每条结果的具体值。对这样的查询我们可以通过基数估计的方法快速返回结果大小的近似值。
目前方法的分类
基数估计是一个重要且较为困难的问题,几十年来一直有研究者尝试用各种方法和技巧提升估计的准确性和稳健性,现有的方法可以分为如下几类:
总体上可以分类传统型方法和基于机器学习的方法。下面会选取其中具有代表性的几个工作简要介绍。
传统型基数估计方法
传统型基数估计方法大体上可以分为基于概要(synopsis-based)和采样(sampling)的两大类方法。
基于概要的基数估计方法会预先收集数据库的一些统计信息,并基于独立性等简单假设,能够方便快速地求解查询基数。
例如基于直方图(histogram)的方法,其对数据表中每一列总结成一张等宽(equal width)或等深(equal depth)的直方图,最后根据查询条件,基于列与列之间相互独立的假设,估计出查询结果的大小。当然有时这样的独立性假设效果不好,便可根据多维直方图(multi-dimensional histogram)的方法求解。
数据画像(sketching)也属于基于概要的基数估计方法,其使用bitmap或哈希的方法,估计数据库中互不相同的元素个数,比较适合流式数据的场景。更新的一类数据画像的方法如loglog、hyperloglog等,更加注重节约内存和提升估计的稳健性。
基于采样的方法会从原始数据表中随机抽取一定比例或者一定数量的元组,最终根据在采样集上执行查询后的结果大小除以相应的缩放比例便可得到查询在原数据库的基数估计。基于采样的方法在采样策略较好、能反映大部分数据分布的情况下效果较好,但也很容易由于采样的随机性无