前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试635】在Oracle中,直方图分为哪几类?

【DB笔试面试635】在Oracle中,直方图分为哪几类?

作者头像
小麦苗DBA宝典
发布2019-09-29 16:23:51
1K0
发布2019-09-29 16:23:51
举报

题目部分

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

答案部分

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如下所示:

代码语言:javascript
复制
SELECT SAL,COUNT(*) COUNTS,SUM(COUNT(*)) OVER(ORDER BY SAL RANGE UNBOUNDED PRECEDING) CURR_ROWS FROM T_ST_20170604_LHR T GROUP BY T.SAL;--从表中获取累加值
SELECT 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的数量。

(3)频率和高度平衡直方图的比对

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档