Oracle 统计信息和直方图(2)

        直方图:是统计信息一种,对数据分布的统计,目的是为了更精确的得到选择率和基数,CBO才能估计出最优的执行计划。

       上一篇我们知道了统计信息在:表,列,索引上能够获取的统计信息,但如果有一个sql:

         select * from table where x=1;(在x列上有索引)

       那Oracle如何选择是表扫描,索引查询数据,通过对列列的统计信息,但没有直方图,CBO优化器不知道x=1的数据有多少?无法提供数据参考。有两钟情况:

         table表中:1,x=1的数据比如就一条   CBO优化器:应该索引查找

                        2,x=1的数据有很多条,CBO优化器:这时应该表扫描

        如果索引列没有直方图,索引上有最大,最小值,总行数,那就不能知道x=1在表中大概有多少行。如果只是有索引上统计信息,就无法获取大概的数据分布

CBO也就得不到正确的结果。

       对于数据分布均匀的列,直方图没意义,对应列中数据分布比较倾斜的列(不均匀),直方图就非常有用。CBO就可以估计大概的数据分布,计算查询的选择率和基数也更精确。

      所以直方图有两种:1,高度均衡直方图  2,频率直方图

          高度均衡直方图: 数据分布不均匀 ,由于列中数据很多,如下:

     

  这时数据比较密集,不利于分析和评估,这时直方图需要均衡化。高度均衡化,得到一下图:

         

          频率直方图:就是数据分布很均匀,

          得到的直方图:信息的准确性就由两个数值决定,一个是bucket的个数,一个NUM_DISTINCT的个数。

          一般来说,bucket的数据越多,关于列数据分布的信息就越正确,但统计直方图的花费的时间和资源就多,oracle中bucket的最大254个,默认是75个。而SQL Server默认是200个。

          在oracle中要删除直方图信息就是设置bucket的数据为1,如下:

              Analyze table 表  compute statistics for table for columns id size 1;

              exec dbms_stats.gather_table_stats('用户', '表',cascade=>false, method_opt=>'for columns 列 size 1');

原文地址:https://www.cnblogs.com/zping/p/1406434.html