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之十六个魔术方法详解
    PHP之十六个魔术方法详解
    让Docker容器使用静态独立的外部IP(便于集群组建)
    桥接和nat模式区别
    使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
    docker gitlab
    docker gitlab安装
    docker ui管理工具
    docker 批量删除容器
    Scrapy设置代理
  • 原文地址:https://www.cnblogs.com/zping/p/1406434.html
Copyright © 2011-2022 走看看