此方案显示了如何使用示例架构生成混合直方图。
假设条件
此方案假定您要在sh.products.prod_subcategory_id
列上生成混合直方图。该表有72行。该prod_subcategory_id
列包含22个不同的值。
生成混合直方图:
- 收集
sh.products
和的统计信息,并prod_subcategory_id
指定10个存储桶。例如,输入以下命令:
BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'SH' , tabname => 'PRODUCTS' , method_opt => 'FOR COLUMNS PROD_SUBCATEGORY_ID SIZE 10' ); END;
复制 - 查询每个不同值占用的行数。
例如,使用以下查询(包括示例输出):
SELECT COUNT(prod_subcategory_id) AS NUM_OF_ROWS, prod_subcategory_id FROM products GROUP BY prod_subcategory_id ORDER BY 1 DESC; NUM_OF_ROWS PROD_SUBCATEGORY_ID ----------- ------------------- 8 2014 7 2055 6 2032 6 2054 5 2056 5 2031 5 2042 5 2051 4 2036 3 2043 2 2033 2 2034 2 2013 2 2012 2 2053 2 2035 1 2022 1 2041 1 2044 1 2011 1 2021 1 2052 22 rows selected.
复制该列包含22个不同的值。由于存储桶(10)的数量小于22,因此优化器无法创建频率直方图。优化器同时考虑混合直方图和最高频率直方图。要获得最高频率直方图的资格,前10个最频繁的值所占的行百分比必须等于或大于阈值p,其中p为(1-(1/10))* 100或90%。但是,在这种情况下,前10个最频繁的值占据了72行中的54行,仅占总数的75%。因此,优化器选择混合直方图,因为最高频率直方图的标准不适用。
- 查询该
country_subregion_id
列的直方图信息。例如,使用以下查询(包括示例输出):
SELECT TABLE_NAME, COLUMN_NAME, NUM_DISTINCT, HISTOGRAM FROM USER_TAB_COL_STATISTICS WHERE TABLE_NAME='PRODUCTS' AND COLUMN_NAME='PROD_SUBCATEGORY_ID'; TABLE_NAME COLUMN_NAME NUM_DISTINCT HISTOGRAM ---------- ------------------- ------------ --------- PRODUCTS PROD_SUBCATEGORY_ID 22 HYBRID
复制 - 查询该列的端点号,端点值和端点重复计数
country_subregion_id
。例如,使用以下查询(包括示例输出):
SELECT ENDPOINT_NUMBER, ENDPOINT_VALUE, ENDPOINT_REPEAT_COUNT FROM USER_HISTOGRAMS WHERE TABLE_NAME='PRODUCTS' AND COLUMN_NAME='PROD_SUBCATEGORY_ID' ORDER BY 1; ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_REPEAT_COUNT --------------- -------------- --------------------- 1 2011 1 13 2014 8 26 2032 6 36 2036 4 45 2043 3 51 2051 5 52 2052 1 54 2053 2 60 2054 6 72 2056 5 10 rows selected.
复制在基于高度的直方图中,优化器会将72行平均分配到10个指定的直方图存储桶中,以便每个存储桶包含大约7行。
由于这是一个混合直方图,因此优化程序将分配值,以使任何值都不会占用一个以上的存储桶。例如,优化程序不会将某些值实例2036
放入一个存储桶中,而不会将此值的某些实例放入另一个存储桶中:所有实例都在bucket中36
。端点重复计数显示桶中最高值被重复的次数。通过使用端点号和这些值的重复计数,优化器可以估计基数。例如,桶
36
包含的值的实例2033
,2034
,2035
,和2036
。而端点值2036
的端点重复计数为4
,因此优化器知道存在该值的4个实例。对于2033
不是端点的值(例如),优化器使用密度来估计基数。
(优化器使用内部算法基于存储桶数和NDV等因素来计算密度。密度表示为0
和1 之间的十进制数字 。接近的值1
表示优化程序期望引用谓词列表中此列的查询返回许多行。接近的值0
表示优化器期望返回几行。)
也可以看看:
- Oracle Database PL / SQL软件包和类型参考以了解该
DBMS_STATS.GATHER_TABLE_STATS
过程 - Oracle数据库参考以了解
USER_TAB_COL_STATISTICS
视图 - Oracle数据库参考以了解
USER_HISTOGRAMS
视图