暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

彻底搞懂Oracle直方图(二)

数据最前线 2024-08-08
198

Hybrid Histogram

Hybird直方图结合了Frequency和HEIGHT BALANCED直方图的优点,这种“两全其美”的方法使优化器在"准Popular values"场景下能够获得更好的选择度评估。

Hybird直方图中,每个ENDPOINT_VALUE只会被分配到一个Bucket中,通过计算ENDPOINT_VALUE在这个Bucket中重复出现的次数,来获得数据分布的准确信息。通过这种方法,优化器可以精确评估出"准Popular values"的选择度。

为了帮助大家更好的理解Hybird直方图的工作原理,这里引用官方文档中的案例介绍Hybird直方图的算法。

假定我们有以下数量的硬币。

为了统计每种硬币的数量,我们将硬币放入到3个桶中。按照HEIGHT BALANCED直方图的分配方式,每个桶中的硬币数量相同,因此每个桶中的硬币分配如下。这种分配方式下,5和25被分配在两个桶中,有可能会导致优化器计算不准确。

为此我们根据Hybird直方图工作原理重新调整了硬币分配,不再要求每个桶中的硬币数量相同,但是每种硬币只会放在同一个桶中,由此每个桶中的硬币分配如下图所示。现在统计每个桶中每种硬币出现的次数,结合ENDPOINT_NUMBER和ENDPOINT_VALUE,即可精确得到每种硬币的数量。

Top Frequency

此外,12c中还引入了Top Frequency直方图,可以看做是Frequency直方图的升级版,这类直方图不再保存Non-popular values的信息,在Bucket数量固定的情况下,将Bucket用于保存更多的Popular values,从而减少生成HEIGHT BALANCED直方图的概率。

除了Bucket数量的限制之外,Top Frequency直方图的使用,还需要满足限定条件:由TOP n个Popular values占据行的百分比等于或大于阈值p,这里p = (1-(1/n))*100, n 为Bucket数量。这个限定条件主要是确保所有的Popular values都有独立的Bucket保存。

新版本的增强

除了新增了Top Frequency和Hybird直方图外,12c之后还有一些其他小的增强:

  • 最大Bucket数量从254增加到2048,这将大大减少HEIGHT BALANCED和Hybird直方图的使用频率;
  • 对于字符数据,直方图只统计字段的前32个字符,假如某个字段长度超过32,并且其前面的32个字符都相同,则会被认为是同一个值。12c之后字符统计长度从32增加到64。

unsetunset直方图的管理unsetunset

直方图收集

直方图是统计信息的一种,其收集方法是在表等统计信息的基础上添加额外的参数来实现。比如,以下的语句就是在收集表统计信息的同时,额外收集SAL列的直方图信息,并且设定用10个Bucket来保存这些信息。

DBMS_STATS.GATHER_TABLE_STATS (NULL,'EMP', method_opt => 'FOR COLUMNS sal SIZE 10');

为了大家学习和日后查阅方便,这里列举常见的直方图收集语法。

- FOR ALL [INDEXED | HIDDEN ] COLUMNS [size_clause]
- FOR COLUMNS [size clause] column [size_clause] [,column [size_clause]...]

其中,
size_clause 可以定义为 size {integer | REPEAT | AUTO | SKEWONLY}
column 可以定义为 column_name | extension name | extension

- integer: 用于保存直方图的桶数目,11g取值范围 [1, 254]
- REPEAT: 仅收集那些已经收集过直方图的列
- AUTO: Oracle基于数据分布和列的负载自主决定收集哪些列的直方图
- SKEWONLY: Oracle基于数据分布自主决定收集哪些列的直方图

unsetunset总结unsetunset

这篇文章给大家介绍了Oracle数据库中直方图的使用和管理。现实世界中的数据并不总是均衡的,为了更好的评估这类数据的访问成本,Oracle引入两种基础类型的直方图 FREQUENCY 和 HEIGHT BALANCED 来解决这个问题。

  • FREQUENCY直方图中,每个唯一值的数据都有对应Bucket可以保存,但是Bucket的数量有限;
  • 当唯一值超过Bucket上限时,Oracle使用HEIGHT BALANCED直方图对数据进行一定的稀疏,会将唯一值均匀保存到每个Bucket中,并将出现在多个Bucket中的值定义为Popular Values,采用特殊的算法计算其选择度;
  • 某些值出现的频率很频繁,但是并没有出现在两个Bucket中,Non-Popular Values的算法又不能正确的评估出这类数据的选择度。为此Oracle 12c以后引入了Hybird直方图,这种直方图结合了FREQUENCY 和 HEIGHT BALANCED的优点,每个ENDPOINT_VALUE不再均匀分布到每个Bucket中,并且相同的值只出现在同一个Bucket中,由此能够更加精确的评估"准Popular Values"数据的选择度。

以上就是这篇文章的所有内容,文中有描述不清楚的,或者大家有疑问,欢迎留言讨论。


数据最前线





身边的数据架构师



文章转载自数据最前线,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论