在Oracle中,直方图分为哪几类?

2023年 9月 25日 23.6k 0

Oracle数据库里的直方图使用了一种称为Bucket(桶)的方式来描述目标列的数据分布。Bucket(桶)是一个逻辑上的概念,相当于分组,每个Bucket就是一组,每个Bucket里会存储一个或多个目标列中的数据。Oracle会用两个维度来描述一个Bucket,这两个维度分别是ENDPOINT_NUMBER和ENDPOINT_VALUE,Oracle会将每个Bucket的这两个维度记录在数据字典基表SYS.HISTGRM$中。列的直方图的类型可以通过查询视图DBA_TAB_COL_STATISTICS的HISTOGRAM列来获取,一般情况下包含3类,NONE(没有直方图)、FREQUENCY(频率直方图,也叫等频直方图)、HEIGHT BALANCED(高度平衡直方图,也叫等高直方图)。在Oracle 12c中,又新增了两种类型的直方图,分别是顶级频率直方图(Top Frequency Histogram)和混合直方图(Hybrid Histogram),本书只讨论频率和高度平衡直方图。

(1)频率(Frequency,Freq)直方图

在Oracle 12c之前,在目标列的数据分布是倾斜的情况下(即存储在数据字典里的目标列的DISTINCT值的数量小于目标表的记录数),如果存储在数据字典里描述目标列直方图的Bucket的数量等于目标列的DISTINCT值的数量,那么这种类型的直方图就是频率(Frequency)直方图。频率直方图只适用于那些目标列的DISTINCT值数量小于或等于254的情形。需要注意的是,在Oracle 12c中,频率直方图所对应的Bucket的数量可以超过254。

对于频率直方图而言,目标列直方图的Bucket的数量就等于目标列的DISTINCT值的数量,此时目标列有多少个DISTINCT值,Oracle在数据字典DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS、DBA_SUBPART_HISTOGRAMS(分别对应于表、分区和子分区的直方图统计信息)中就会存储多少条记录,每一条记录就代表了对其中的一个Bucket的描述,上述数据字典中的字段ENDPOINT_VALUE记录了这些DISTINCT值,而字段ENDPOINT_NUMBER则记录了到此DISTINCT值为止总共有多少条记录。需要注意的是,对频率直方图而言,ENDPOINT_NUMBER是一个累加值,可以用一条记录的ENDPOINT_NUMBER值减去它上一条记录的ENDPOINT_NUMBER值来得到这条记录本身所对应的ENDPOINT_VALUE值的记录数,SQL如下所示:

1SELECT SAL,COUNT(*) COUNTS,SUM(COUNT(*)) OVER(ORDER BY SAL RANGE UNBOUNDED PRECEDING) CURR_ROWS FROM T_ST_20170604_LHR T GROUP BY T.SAL;--从表中获取累加值
2SELECT TABLE_NAME,COLUMN_NAME,ENDPOINT_NUMBER,ENDPOINT_VALUE,NVL((ENDPOINT_NUMBER-(LAG(ENDPOINT_NUMBER) OVER (ORDER BY ENDPOINT_VALUE))),ENDPOINT_NUMBER) COUNTS FROM DBA_TAB_HISTOGRAMS WHERE TABLE_NAME='T_ST_20170604_LHR';--从直方图中获取分组记录数

(2)高度平衡(Height Balanced,HtBal)直方图

如果存储在数据字典里描述目标列直方图的Bucket的数量小于目标列的DISTINCT值的数量,那么这种类型的直方图就是高度平衡(Height Balanced)直方图。在高度平衡直方图中,执行计划的列的选择性没有频率直方图精确,而在现实很多时候,列的唯一值是超过254的,那么只能使用高度平衡直方图。在高度平衡直方图中,在DBA_TAB_HISTOGRAMS视图中,EDNPOINT_NUMBER代表桶号,且自动省去EDNPOINT_VALUE值相同且ENDPOINT_NUMBER相邻的桶的值。ENDPOINT_VALUE表示每一个桶中的最大值,而第一个桶记录的是最小值(Bucket为0的行,即EDNPOINT_NUMBER为0的行)。重复出现为ENDPOINT_VALUE的值称为Popular Value。若Popular Value所在记录的ENDPOINT_NUMBER值和它上一条记录的ENDPOINT_NUMBER值之间的差值越大,则意味着该Popular Value在目标表中所占的比例也就越大,它所对应的Cardinality也就越大。在高度平衡直方图中,除了最后1个桶可能包含的数据比其它的桶少以外,所有其它的桶包含相同数量的值,其值为目标表总记录数除以Bucket的数量。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论