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');

posted @   zping  阅读(3275)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示