千家信息网

oracle直方图

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,直方图概述:直方图是一种统计学上的工具,并非Oracle专有,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数
千家信息网最后更新 2025年11月07日oracle直方图

直方图概述:

直方图是一种统计学上的工具,并非Oracle专有,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。
在Oracle中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策。当where 子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况下如果where 子句的过滤谓词列之上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得SQL语句执行成本最低从而提升性能。
在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优化器就可以决定使用将返回少量行的索引,而避免使用基于限制条件返回许多行的索引。直方图的使用不受索引的限制,可以在表的任何列上构建直方图。
构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划 。例如,如果一到两个值构成了表中的大部分数据(数据偏斜),相关的索引就可能无法帮助减少满足查询所需的I/O数量。创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时应该根据WHERE子句中的值返回表中80%的记录。
通常情况下在以下场合中建议使用直方图:
1、当Where子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于WHERE 子句中的值将会使优化器选择不同的执行计划。这时应该使用直方图来帮助优化器来修正执行路径。(注意:如果查询不引用该列,则创建直方图没有意义。这种错误很常见,许多 DBA 会在偏差列上创建柱状图,即使没有任何查询引用该列。)
2、当列值导致不正确的判断时:这种情况通常会发生在多表连接时,例如,假设我们有一个五项的表联接,其结果集只有10行。Oracle 将会以一种使第一个联接的结果集(集合基数)尽可能小的方式将表联接起来。通过在中间结果集中携带更少的负载,查询将会运行得更快。为了使中间结果最小化,优化器尝试在SQL执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会极大地帮助优化器作出正确的决策。如优化器对中间结果集的大小作出不正确的判断,它可能会选择一种未达到最优化的表联接方法。因此向该列添加直方图经常会向优化器提供使用最佳联接方法所需的信息。


如何使用直方图:

为表的所有索引字段建立直方图:

exec dbms_stats.gather_table_stats('HDC_DAG','EB_JBXX',method_opt => 'for all indexed columns size 254',cascade => true);

为指定字段建立直方图:

exec dbms_stats.gather_table_stats('HDC_DAG','EB_JBXX',method_opt => 'for columns size 100 xb',cascade => true);


exec dbms_stats.gather_table_stats('HDC_DAG','DA_GRJBXX', estimate_percent => dbms_stats.auto_sample_size,method_opt => 'for columns xm size auto ',cascade => true);

删除直方图:

exec dbms_stats.gather_table_stats('用户', '',cascade=>false, method_opt=>'for columnssize 1');

exec dbms_stats.delete_column_stats('HDC_DAG','EB_JBXX','JLLYXTBH',col_stat_type => 'HISTOGRAM');

查看列的直方图存储桶(bucket)信息:

select * from user_histograms t where t.TABLE_NAME ='EB_JBXX' and t.COLUMN_NAME ='XM';


直方图的分析是建立在索引的分析上


创建直方图的考虑因素:

其中size 10指定的是直方图所需的存储桶(bucket)数,所谓存储桶可以理解为存储数据的容器,这个容器会按照数据的分布将数据尽量平均到各个桶里,如一张表如果有6000条记录,那么每个桶中平均就会有600条记录,但这只是一个平均数,每个桶中的记录数并不会相等,它会将高频出现记录集中在某一些桶中,低频记录会存放在少量桶中,因此如果存储桶(bucket)数合适的增加就会减少高频记录使用的桶数,统计结果也会更加准确(可以避免被迫将低频记录存入高频桶中,影响优化器生成准确的执行计划)。所以我们最后得到的直方图信息的准确性就由两个数值决定,一个是BUCTET的个数,一个NUM_DISTINCT的个数。所以创建直方图时首先要正确地估计存储桶(bucket)数。默认情况时,Oracle的直方图会产生75个存储桶。可以把SIZE的值指定在1~254之间。


直方图 数据 情况 索引 结果 存储 子句 信息 偏差 成本 数量 分析 帮助 查询 选择 常会 数值 质量 统计 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东移动的服务器密码在哪里修改 成人本科软件开发能进华为吗 方舟 非官方服务器 安全吗 关于学生观看网络安全总结 服务器管理口设置原理 数据库正在还原解决办法 php数据库扩展 江西省网络安全技能大赛 某市网络安全工作计划 专业软件开发专业服务 数据库 学生管理系统 总结 沈阳app软件开发制作 东莞学习网络安全技术 护苗网络安全课下载10 京铁手机报网络安全 软件开发金融软件开发方向 知识元建模用什么数据库 数据库与用友u8连接 数据库如何重新定义类型 数据库数据加一个数 软件开发项目组起名 共建机制与网络安全 如何复制别人的网站服务器 明日之后老服务器该如何赚取金条 幼儿园网络安全教育和培训制度 铜陵专业模具软件开发费用 自己买服务器与云服务器哪个贵 鼎天云宏网络技术电话 魔兽世界按键不保存到服务器 简述网络安全模型的作用
0