
近期看到某群里关于数据库直方图的讨论,不禁回想起刚学习 Oracle 的时候,为直方图的设计而感叹。直方图可以说是优化器的基础,对于数据分布不均衡的场景下制定出合理的执行计划至关重要。那么国产数据库这方面又如何呢?这里针对几种常见的国产数据库的直方图能力看看能力如何。
在开始说明国产数据库直方图能力之前,先来回顾下直方图的概念,并以经典数据库Oracle为代表进行说明下。
1).直方图概念
直方图是数据库用来判断列中数据分布情况的一种统计信息,属于列的统计信息。如果数据分布不均匀,查询优化器需要额外的信息才能做出正确的估算。直方图正是数据库为查询优化器提供更精确的成本估计而设计的一种直方图数据。其原理是假定存在n个桶(buckets),每个桶代表一个取值或者一个取值范围,将列中不同的值放入与之对应的桶中,通过这些桶的统计来得到列上数据分布的情况。
2).直方图分类
✦ 基于频率的直方图(frequency histogram)
当列的唯一值数量小于或等于桶允许的最大值(254)时,数据库会使用基于频率的直方图。每个值将会占据一个桶。每个桶的高低代表每个值出现的次数。


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

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

1).各数据库直方图直方图能力
WITH N BUCKETS)不小于列的唯一值数量时,生成等宽直方图;否则生成等高直方图。
✦ DM

✦ KingBase

✦ YashanDB

✦ OceanBase

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





