此方案显示了如何使用示例架构生成频率直方图。
假设条件
此方案假定您要在sh.countries.country_subregion_id列上生成频率直方图。该表有23行。
以下查询显示该country_subregion_id列包含8个不均匀分布的值(包括示例输出):
SELECT country_subregion_id, count(*)
FROM sh.countries
GROUP BY country_subregion_id
ORDER BY 1;
COUNTRY_SUBREGION_ID COUNT(*)
-------------------- ----------
52792 1
52793 5
52794 2
52795 1
52796 1
52797 2
52798 2
52799 9
生成频率直方图:
- 收集
sh.countries和country_subregion_id列的统计信息,让存储桶数默认为254。例如,执行以下PL / SQL匿名块:
BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'SH' , tabname => 'COUNTRIES' , method_opt => 'FOR COLUMNS COUNTRY_SUBREGION_ID' ); END; - 查询该
country_subregion_id列的直方图信息。例如,使用以下查询(包括示例输出):
SELECT TABLE_NAME, COLUMN_NAME, NUM_DISTINCT, HISTOGRAM FROM USER_TAB_COL_STATISTICS WHERE TABLE_NAME='COUNTRIES' AND COLUMN_NAME='COUNTRY_SUBREGION_ID'; TABLE_NAME COLUMN_NAME NUM_DISTINCT HISTOGRAM ---------- -------------------- ------------ --------------- COUNTRIES COUNTRY_SUBREGION_ID 8 FREQUENCY优化程序选择频率直方图,因为该列中存在n个或更少的不同值,其中n默认为
254。 - 查询该
country_subregion_id列的端点号和端点值。例如,使用以下查询(包括示例输出):
SELECT ENDPOINT_NUMBER, ENDPOINT_VALUE FROM USER_HISTOGRAMS WHERE TABLE_NAME='COUNTRIES' AND COLUMN_NAME='COUNTRY_SUBREGION_ID'; ENDPOINT_NUMBER(端点号) ENDPOINT_VALUE(端点值) --------------- -------------- 1 52792 6 52793 8 52794 9 52795 10 52796 12 52797 14 52798 23 52799端点号:可以理解为桶号端点值:可以理解为这个桶里最大的值图11-2是直方图中的8个存储桶的图形说明。每个值都表示为投入桶中的硬币。
图11-2频率直方图
如图11-2所示,每个不同的值都有其自己的存储桶。因为这是频率直方图,所以端点号是端点的累积频率。对于
52793,端点号6表示该值出现5次(6-1)。对于52794,端点号8表示该值出现2次(8-6)。每个端点至少比上一个端点大2的存储桶都包含一个流行值。因此,水桶
6,8,12,14,并23包含一些流行值。优化器根据端点号计算其基数。例如,优化器使用以下公式计算值的基数(C)52799,其中表中的行数为23:C = 23 * ( 9 / 23 )桶
1,9以及10包含nonpopular值。优化器根据密度估计其基数。
也可以看看:
- Oracle Database PL / SQL软件包和类型参考以了解该
DBMS_STATS.GATHER_TABLE_STATS过程 - Oracle数据库参考以了解
USER_TAB_COL_STATISTICS视图 - Oracle数据库参考以了解
USER_HISTOGRAMS视图
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




