“ 摘要:本文主要讲述基于代价的优化器中统计信息直方图的作用和种类。主要内容如下:
概述
统计信息
直方图
结论
”
01
—
概述
基于代价的优化器引擎可能面临的问题和挑战如下。
从可选的单表扫描方式中,挑选什么样的单表扫描方式是最优的?
对于两个表连接时,如何连接是最优的?
对于多个表连接,连接顺序有多种组合,哪种连接顺序是最优的?
对于多个表连接,连接顺序有多种组合,是否要对每种组合都探索?如果不全部探索,怎么找到最优的一种组合?
那么碰到这些问题,我们如何解决呢,这里就引入了一个非常重要的功能叫做代价估算模型(Cost Model),我们用代价估算模型计算出各种情况下执行的代价,然后优化器选择一个代价最小的计划,来作为后续执行的计划。
代价估算模型能估算一个计划的代价大小,依赖一个非常重要的功能统计信息。那么我们先来了解下统计信息的基本概念。
02
—
统计信息
优化器统计信息是描述数据库中表和列的元数据信息的集合,它主要用来估计谓词的选择率和中间查询结果的大小,从而用于创建高质量的执行计划的基础。优化器统计信息主要包括行级别的统计信息和列级别的统计信息:
行级别的统计信息:包括行的总数、行的平均长度、表在磁盘中占用了多少page等。
列级别的统计信息:包括列的最大值、最小值、列中空值个数、列中非空值个数、不同值个数(Number of Distinct Value, 或NDV)和直方图等。
直方图与CBO的关系
从一个行源中评估返回行数所占的比例这就是选择率,选择率在CBO的查询优化中起着重要作用。选择率的取值范围是0到1之间。粗略的讲如果满足谓词条件的只有少量的行记录,那么CBO将更喜欢使用索引扫描,如果谓词条件要从表中获取大量数据那么CBO将更喜欢使用全表扫描。
比如下面的查询获取deptno等于10的所有雇员信息如果返回少量的记录查询将会更倾向于使用索引扫描:
SELECT * FROM emp WHERE deptno = 10;
为了评估选择率(或者换句话说计算出最优执行计划),CBO会使用各种形式的统计信息,配置参数等。以表中列的角度来说,CBO会收集以下统计信息:
列中不同值的数量也就是NDV
列中的最小值/最大值
列中null值的数量
数据分布或直方图信息
在没有直方图时,优化器使用基表中记录的列中不同值的数量,列中最小值/最大值和列中null值的数量来计算统计信息。使用这些信息优化器假设数据在列中的最小值和最大值之间是均匀分布的或者说列中每一个不同值的出现次数是相同的。
下面进行举例说明:
创建一个测试表histograms_test它有10000行记录, 表特征如下所示
有两个列
列uniqueVal包含不同值的范围从1到10000