番外篇:国产数据库直方图能力对比

近期看到某群里关于数据库直方图的讨论,不禁回想起刚学习 Oracle 的时候,为直方图的设计而感叹。直方图可以说是优化器的基础,对于数据分布不均衡的场景下制定出合理的执行计划至关重要。那么国产数据库这方面又如何呢?这里针对几种常见的国产数据库的直方图能力看看能力如何。

1. 直方图的前世今生

在开始说明国产数据库直方图能力之前,先来回顾下直方图的概念,并以经典数据库Oracle为代表进行说明下。

1)直方图概念

直方图是数据库用来判断列中数据分布情况的一种统计信息,属于列的统计信息。如果数据分布不均匀,查询优化器需要额外的信息才能做出正确的估算。直方图正是数据库为查询优化器提供更精确的成本估计而设计的一种直方图数据。其原理是假定存在n个桶(buckets),每个桶代表一个取值或者一个取值范围,将列中不同的值放入与之对应的桶中,通过这些桶的统计来得到列上数据分布的情况。

2)直方图分类基于频率的直方图(frequency histogram)

当列的唯一值数量小于或等于桶允许的最大值(254)时,数据库会使用基于频率的直方图。每个值将会占据一个桶。每个桶的高低代表每个值出现的次数。

1.png

基于高度的直方图(height-balanced histogram)

当列的唯一值数量大于桶数时,数据库会采用基于高度的直方图反映数据分布,每个bucket容纳相同数量的值。

2.png

其他变体

处理上述直方图类型外,还有为了反馈更“大众”数据的TopN直方图,满足更准确数据的混合直方图等等。

3)Oracle 直方图发展

Oracle 最早在7.3版本引入直方图,但直到 Oracle 8i 版本后才逐渐成熟并广泛使用。下表以作为常见的11g版本为分界,对比总结了之前与之后直方图的功能演进。从下面这一表格中可见直方图的发展策略,一方面是支持更为多样的直方图类型,一方面是增加桶数,满足更为精准的数据描述,还有就是在文本处理、生成策略等方面的改进。这些也指导了国产数据库对直方图能力的支持。

3.png

2. 国产数据库直方图能力总结

下面列举了几种常见的国产数据库直方图的能力,并与Oracle、MySQL加以比较。初步感觉,各国产数据库都支持了直方图能力,但支持范围不同,有些支持更全面些。此外,很多国产数据库都将直方图能力作为缺省的统计信息来收集,这点与Oracle 11g不同。

1)各数据库直方图直方图能力MySQL

MySQL 从8.0.19版本开始引入了直方图功能,主要用于优化查询性能,特别是在无索引列或数据分布不均匀的场景下。MySQL支持两种直方图类型,由系统自动选择:一是等宽直方图, 每个桶存储单个值及其频率,适用于离散值较少的列(如枚举类型);一是等高直方图,每个桶存储值的范围、频率和累积分布,适用于连续值或分布范围较大的列。当桶数量(WITH N BUCKETS)不小于列的唯一值数量时,生成等宽直方图;否则生成等高直方图。

DM

5.png

KingBase

6.png

YashanDB

7.png

OceanBase

8.png

2)测试:是否采集直方图对基数评估影响

下面针对部分国产数据库做了直方图的测试。这里构造了一张表,包含10000条记录,两个字段FNUM、HNUM分别对应100个和1000个不同值。为了构造倾斜,还将500条数据修改为9999来表示大基数的数值。在收集直方图时,统一使用200个桶来进行测试。下面表格标题栏[]里为实际记录数,单元格内为执行计划中反馈预估行数。从各家执行情况来看,收集直方图后的评估还是很准确的。

9.png

阅读剩余
THE END