阿里云
发表主题 回复主题
  • 486阅读
  • 1回复

ORACLE高度平衡直方图谓词评估

级别: 论坛粉丝
发帖
1402
云币
2808
                         ORACLE高度平衡直方图谓词评估

                        

        在之前的一篇文章中提到,oracle对于栏位distinct值大于手动指定的值或

distinct value大于254就会构建高度平衡直方图( HEIGHT BALANCED)

      

     以用户frank创建表T2,值的分布如下.

SQL> select a,count(*) from frank.t2 group by a order by a;

         A   COUNT(*)

---------- ----------

         1        100

         2        100

         3          1

        10        200

        11        200

        15        200

        16        300

   构造数据分布不均匀,再在该栏上创建直方图,桶数为5,这样bucket的数量就小于栏位A的distinct value 7

SQL> begin

  2   dbms_stats.gather_table_stats(tabname=>'T2',ownname=>'FRANK',method_opt=>'FOR COLUMNS A SIZE 5');

  3  end;

  4  /

PL/SQL procedure successfully completed.

SQL> select * from user_histograms where table_name='T2' and column_name='A';

TABLE_NAME COLUMN_NAM ENDPOINT_NUMBER ENDPOINT_VALUE ENDPOINT_A

---------- ---------- --------------- -------------- ----------

T2         A                        0              1

T2         A                        1             10

T2         A                        2             11

T2         A                        3             15

T2         A                        5             16

通过max endpoint_number可以看出oracle创建了5个bucket.经过压缩过后桶的数量为4,第0个不算

现在来看histogram对cardinality的评估.


SQL> explain plan for select * from t2 where a=3;

Explained.

   

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |   110 |   660 |     3   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| T2   |   110 |   660 |     3   (0)| 00:00:01 |

--------------------------------------------------------------------------

对a=3的评估为110,a的实际行数为1.根据高度平衡的算法,从中我们可以总结出高度平衡直方图对于"="谓词的评估算法.

高度平衡直方图的特点就是每个桶中的行数是一样的.1101/5个可以算出每个bucket包括的行数是220.2.

公式为:

如果谓词等于endpoint_value

(num_rows)/(max endpoint_number)*(endpoint_number-endpoint_number(上一个)-trunc((1/trunc(distinct value)/(buckets-1))),111))

如果谓词不等于endpoint_value

(num_rows)/(max endpoint_number)*trunc((1/trunc(distinct value)/(buckets-1))),1111)


通过以上的公式,我们可以算出值例子中的cardinlity.3小于10,落在endpoint_number 为1的桶中

(1101)/5*trunc((1/trunc(7/(4-1))),111)=110.1

高度平衡直方图本身的算法决定每个桶中存放相同数据的行(num_rows)/(max endpoint_number),可以算出每个桶中存

放的行数为220行,在压缩过后桶的数量为4的结果出来后,oracle会假设值在桶里平均分布,最后一个桶中放最后的值.所以4个桶,

前3个桶每个桶中存放2个值.最后1个桶中存放的是最后1个值,那么每个桶中每个值出现的机会就是 1/2.

而endpoint_number-endpoint_number(上一个)是因为有时候会存在压缩.从这里也可以看出高度平衡直方图并不是很准确.

再来看看16,endpoint_number 5的endpoint_value为16,通过我们的可式可以算出

(1101)/5*((5-3)-trunc((1/trunc(7/(4-1))),111))=330.3

SQL> explain plan for select * from t2 where a=16;

Explained.

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |   330 |  1980 |     3   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| T2   |   330 |  1980 |     3   (0)| 00:00:01 |

对于>,<,>=,<=的谓词,我们可以根据返回的行数可以总结出来.对于endpoint_value落在最后一个桶中的value,值的评估是0.5.需要注意




oracle, 平衡, 评估, value, 用户






级别: *
发帖
*
云币
*


这么好的帖子竟然没人占楼哈哈 楼主学习了
发表主题 回复主题
« 返回列表
«12345678910»
共10页
上一主题下一主题

限100 字节
批量上传需要先选择文件,再选择上传
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)

      版权声明

      开发者论坛为你提供“ORACLE高度平衡直方图谓词评估”的内容,论坛中还有更多关于 “ORACLE高度平衡直方图谓词评估” 的内容供你使用,该内容是网友上传,与开发者论坛无关,如果需要删除请联系zixun-group@service.aliyun.com,工作人员会在5个工作日内回复您。