zoukankan      html  css  js  c++  java
  • 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');

  • 相关阅读:
    整数数组中最大子数组的和的问题(续)
    整数数组中最大子数组的和的问题
    PHP开发环境(Apache+mysql+PHPstorm+php)的搭建
    echart 库 初始
    2.15 学习总结 之 天气预报APP volley(HTTP库)之StringRequest
    2.14 学习总结 之 序列化
    2.13 阶段实战 使用layui重构选课系统
    2.12 学习总结 之 表单校验插件validate
    jsp连接数据库的乱码问题 servlet请求参数编码处理get post
    Rocket
  • 原文地址:https://www.cnblogs.com/zping/p/1406434.html
Copyright © 2011-2022 走看看