在数据库中,SQL 的优化可以分为基于规则的优化(RBO)和基于代价的优化(CBO),基于规则的优化只需要根据给定的规则进行关系代数表达式的转换,而基于代价的优化除了需要优化规则以外,还需要根据统计信息对物理算子进行代价估算,最后选择代价最低的关系代数表达式作为最终的优化结果。本文将针对统计信息以及其使用进行介绍。

什么是统计信息

数据库在执行基于代价的优化时,需要针对每种物理算子计算其执行代价,比如该算子涉及到的数据行数,执行计算需要消耗的 CPU 以及内存的大小。但是在优化时又不可能将代价计算的非常精确,所以只能做估算处理,以便能区分同一个逻辑算子对应的多个物理算子之间的代价。数据库依据的这些信息就是统计信息。主要使用的统计信息包括,表的总行数,每列的不同值数,直方图,null 值的个数等等。

直方图

直方图(histogram)是表示每个列的取值分布,对于一个列的取值分布情况,直方图将其划分成若干个区间,每个区间的宽度就是区间值的上下界,区间的高度就是落在该区间的的值的个数。它占用的内存空间较少,所以可以存储在内存中。 直方图主要分为等深直方图和等宽直方图,等深直方图是指不同区间的取值个数相同,而等宽直方图是指每个区间的宽度相同。