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

Oracle 19C 生成混合直方图

原创 Asher.HU 2021-02-04
565


此方案显示了如何使用示例架构生成混合直方图。

假设条件

此方案假定您要在sh.products.prod_subcategory_id上生成混合直方图该表有72行。prod_subcategory_id列包含22个不同的值。

生成混合直方图:

  1. 收集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;
    
    复制
  2. 查询每个不同值占用的行数。

    例如,使用以下查询(包括示例输出):

    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%。因此,优化器选择混合直方图,因为最高频率直方图的标准不适用。

  3. 查询该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
    
    复制
  4. 查询该列的端点号,端点值和端点重复计数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包含的值的实例203320342035,和2036。而端点值2036的端点重复计数为4,因此优化器知道存在该值的4个实例。对于2033不是端点的值(例如),优化器使用密度来估计基数

    (优化器使用内部算法基于存储桶数NDV等因素来计算密度密度表示为0和1 之间的十进制数字 接近的值1表示优化程序期望引用谓词列表中此列的查询返回许多行。接近的值0表示优化器期望返回几行。)

也可以看看:

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论