没有合适的资源?快使用搜索试试~ 我知道了~
结合实例深入讲解oracle中的直方图histogram
5星 · 超过95%的资源 需积分: 10 56 下载量 158 浏览量
2012-06-21
19:02:38
上传
评论 1
收藏 334KB PDF 举报
温馨提示
试读
15页
文章内容转载自网络。 从直方图的概念 直方图的作用、使用场合……等内容深入分析了oracle直方图,并给出了操作实例,建议收藏备查。
资源推荐
资源详情
资源评论
Oracle histogram
1 何谓直方图
直方图是一种统计学上的工具,并非 Oracle 专有。通常用于对被管理对象的某个方面的质量情况进行管理,通常情况下它会表现为一种
几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据所绘制成的,通常会画成以数量为底
边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。比如下图所示,是一个以关学生化学考试成绩
分数分布情况绘制的直方图:
2 Oracle 中直方图的作用
既然直方图是一种对被管理对象某一方面质量进行管理的描述工具,那么在 Oracle 中自然它也是对 Oracle 中某个对象质量的描述工
具,这个对象就是 Oracle 中最重要的东西——“数据”。
在 Oracle 中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据
的分布情况,以便能够指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执
行全表扫描的决策。当 where 子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况
下如果 where 子句的过滤谓词列之上上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得 SQL 语句执行
成本最低从而提升性能
3 Oracle 中使用直方图的场合
在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优 化器就可以决定使用将返回少量行的索引,而避免使
用基于限制条件返回许多行的索引。直方图的使用不受索引的限制,可以在表的任何列上构建直方图。
构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划:例如,如果一到两个值构成了表中的大部分数据(数据偏
斜),相关的索引就可能无法帮助减少满足查询所需的 I/O 数量。创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时
应该根据 WHERE 子句中的值返回表中 80%的记录。
通常情况下在以下场合中建议使用直方图:
(1)、当 Where 子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于 WHERE 子句中的值将会使优化器选择
不同的执行计划。这时应该使用直方图来帮助优化器来修正执行路径。(注意:如果查询不引用该列,则创建直方图没有意义。这种错误很
常见,许多 DBA 会在偏差列上创建柱状图,即使没有任何查询引用该列。)
(2)、当列值导致不正确的判断时:这种情况通常会发生在多表连接时,例如,假设我们有一个五项的表联接,其结果集只有 10
行。Oracle 将会以一种使第一个联接的结果集(集合基数)尽可能小的方式将表联接起来。通过在中间结果集中携带更少的负载,查询
将会运行得更快。为了使中间结果最小化,优化器尝试在 SQL 执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会
极大地帮助优化器作出正确的决策。如优化器对中间结果集的大小作出不正确的判断,它可能会选择一种未达到最优化的表联接方法。因
此向该列添加直方图经常会向优化器提供使用最佳联接方法所需的信息。
4 如何使用直方图
(1)、创建直方图:
通过使用早先的 analyze 命令和最新的 dbms_stats 工具包都可以创建直方图。Oracle 推荐使用后者来创建直方图,而且直方
图的创建不受任何条件限制,可以在一张表上的任何你想创建直方图的列上创建直方图。我们这里主要介绍如何通过 dbms_stats 包来创
建直方图。
Oracle 通过指定 dbms_stats 的 method_opt 参数,来创建直方图。在 method_opt 子句中有三个相关选项,即
skewonly、repeat 和 auto。
“skewonly” 选项,它的时间性很强,因为它检查每个索引中每列值的分布。如果 dbms_stats 发现一个索引中具有不均匀分
布的列,它将为该索引创建直方图,以帮助基于成本的 SQL 优化器决定是使用索引还是全表扫描访问。示例如下:
begin
dbms_stats. gather_table_stats (
ownname => '',
tabname=>'',
estimate_percent =>dbms_stats.auto_sample_size,
method_opt => 'for all columns size skewonly',
cascade=>true,
degree => 7);
end;
其中 degree 指定了并行度视主机的 CPU 个数而定,estimate_percent 指定了采样比率,此处使用了 auto 目的是让 oracle 来
决定采样收集的比率,绘制直方图时会根据采样的数据分析结果来绘制,当然也可以人为指定采样比率。如:estimate_percent=>20
指定采样比率为 20%,cascade=>true 指定收集相关表的索引的统计信息,该参数默认为 false,因此使用 dbms_stats 收集统计信息
时抹人事部收集表的索引信息的。
在对表实施监视 (alter table xxx monitoring;) 时使用 auto 选项,它基于数据的分布以及应用程序访问列的方式(例如
由监视所确定的列上的负载)来创建直方图。示例如下:
begin
dbms_stats.gather_ table _stats(
ownname => '',
tabname=>'',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size auto',
cascade=>true,
degree => 7
);
end;
重新分析统计数据时,使用 repeat 选项,重新分析任务所消耗的资源就会少一些。使用 repeat 选项时,只会为现有的直方图重新
分析索引,不再生成新的直方图。示例如下:
begin
dbms_stats.gather_ table _stats(
ownname => '',
tabname=>'',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for all columns size repeat',
cascade=>true,
degree => 7
);
end;
(2)、创建直方图的考虑因素:
如果想为某一列创建直方图,示例如下:
begin
dbms_stats.gather_ table _stats(
ownname => '',
tabname=>'',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for columns size 10 列名',
cascade=>true,
degree => 7
);
end;
其中 size 10 指定的是直方图所需的存储桶(bucket)数,所谓存储桶可以理解为存储数据的容器,这个容器会按照数据的分布将
数据尽量平均到各个桶里,如一张表如果有 6000 条记录,那么每个桶中平均就会有 600 条记录,但这只是一个平均数,每个桶中的记录
数并不会相等,它会将高频出现记录集中在某一些桶中,低频记录会存放在少量桶中,因此如果存储桶(bucket)数合适的增加就会减少高
频记录使用的桶数,统计结果也会更加准确(可以避免被迫将低频记录存入高频桶中,影响优化器生成准确的执行计划)。所以我们最后得
到的直方图信息的准确性就由两个数值决定,一个是 BUCTET 的个数,一个 NUM_DISTINCT 的个数。所以创建直方图时首先要正确地估计
存储桶(bucket)数。默认情况时,Oracle 的直方图会产生 75 个存储桶。可以把 SIZE 的值指定在 1~254 之间。
(3)、删除直方图信息:
在 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');
剩余14页未读,继续阅读
资源评论
- xiaod3202014-01-17讲的挺明白的,还不要分,谢谢
- s_zt02062013-01-26说得挺清楚的,谢谢分享了
- bellacat2014-02-26讲得明白 感谢
o8xv0123
- 粉丝: 14
- 资源: 100
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Python大作业:音乐播放软件(爬虫+可视化+数据分析+数据库)
- 课程设计-python爬虫-爬取日报,爬取日报文章后存储到本地,附带源代码+课程设计报告
- 软件和信息技术服务行业投资与前景预测.pptx
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功