- 浏览: 1076493 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyfeifei66:
list<bean> bean 中有 list&l ...
freemarker中的list -
BelloVersion:
第五种错误Remote host closed connect ...
客户端如何使用httpclient向https服务器发送数据 -
willxue:
看了半天 前面说的是错的?。。。
反向键索引的原理和用途 -
liulanghan110:
quainter 写道麻烦博主,参数为数组时,paramete ...
MYBATIS 的parameter -
quainter:
麻烦博主,参数为数组时,parameterType怎么写啊?
MYBATIS 的parameter
一. 何谓直方图:
直方图是一种统计学上的工具,并非Oracle
专有。通常用于对被管理
对 象的某个方面的质量情况进行管理,通常情况下它会表现为一种几何图形表,这个图形表是根据从实际环境中所收集来的被管理对象某个方面的质量分布情况的数据
所绘制成的,通常会画成以数量为底边,以频度为高度的一系列连接起来的矩形图,因此直方图在统计学上也称为质量分布图。比如下图所示,是一个以关学生化学 考试成绩分数分布情况绘制的直方图:
二.Oracle
中直方图的作用:
既然直方图是一种对被管理对象某一方面质量进行管理的描述工具,那么在Oracle
中自然它也是对Oracle
中某个对象质量的描述工具,这个对象就是Oracle
中最重要的东西——“
数据”
。
在Oracle
中直方图是一种对数据分布质量情况进行描述的工具。它会按照某一列不同值出现数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够
指导优化器根据数据的分布做出正确的选择。在某些情况下,表的列中的数值分布将会影响优化器使用索引还是执行全表扫描的决策。当
where
子句的值具有不成比例数量的数值时,将出现这种情况,使得全表扫描比索引访问的成本更低。这种情况下如果where
子句的过滤谓词列之上上有一个合理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得SQL
语句执行成本最低从而提升性能。
三.Oracle 中使用直方图的场合:
在分析表或索引时,直方图用于记录数据的分布。通过获得该信息,基于成本的优
化器就可以决定使用将返回少量行的索引,而避免使用基于限制条件返回许多行的索引。直方图的使用不受索引的限制,可以在表的任何列上构建直方图。
构造直方图最主要的原因就是帮助优化器在表中数据严重偏斜时做出更好的规划:例如,如果一到两个值构成了表中的大部分数据(
数据偏斜)
,相关的索引就可能 无法帮助减少满足查询所需的I/O
数量。创建直方图可以让基于成本的优化器知道何时使用索引才最合适,或何时应该根据WHERE
子句中的值返回表中80
% 的记录。
通常情况下在以下场合中建议使用直方图:
(1 )、当Where 子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于 WHERE 子句中的值将会使优化器选择不同的执行计划。这时应该使用直方图来帮助优化器来修正执行路径。(注意:如果查询不引用该列,则创建直方图没有意义。这种错 误很常见,许多 DBA 会在偏差列上创建柱状图,即使没有任何查询引用该列。)
(2 )、当列值导致不正确的判断时:这种情况通常会发生在多表连接时,例如,假设我们有一个五项的表联接,其结果集只有 10 行。Oracle 将会以一种使第一个联接的结果集(集合基数)尽可能小的方式将表联接起来。通过在中间结果集中携带更少的负载,查询将会运行得更快。为了使中间结果最小 化,优化器尝试在 SQL 执行的分析阶段评估每个结果集的集合基数。在偏差的列上拥有直方图将会极大地帮助优化器作出正确的决策。如优化器对中间结果集的大小作出不正确的判断,它 可能会选择一种未达到最优化的表联接方法。因此向该列添加直方图经常会向优化器提供使用最佳联接方法所需的信息。
四. 直方图有两种类别,等频直方图与等高直方图
默认的,如果一个倾斜列上的唯一值超过了254
个,那么ORACLE
会对此列建立等高直方图,否则建立等频直方图。
通过如下方式,建立表TAB
,更新字段B
,让列B
产生倾斜。并在B
列上创建索引。
SQL> spool d:\hist.txt
SQL> create table tab (a number, b number);
表已创建。
SQL>
SQL> begin
2 for i in 1..10000 loop
3 insert into tab
values (i, i);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL
过程已成功完成。
SQL> update tab set b=5 where b between 6 and 9995;
已更新9990
行。
SQL> commit;
提交完成。
SQL> create index ix_tab_b on tab(b);
索引已创建。
然后分析表,强制使列B
不产生直方图。
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'TAB',
CASCADE => TRUE,
METHOD_OPT => 'FOR COLUMNS B SIZE 1 ');
END;
查看视图USER_TAB_HISTOGRAMS
,列B
上只有最大值,最小值两条记录分别对应端点号(endpoint_number
)0
和1
,这种显示说明列B
没有直方图信息。
SQL>SELECT table_name,column_name,endpoint_number,endpoint_value FROM
USER_TAB_HISTOGRAMS WHERE TABLE_NAME='TAB'
;
TABLE_NAME
COLUMN_NAME
ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ----------------------------------------
--------------- --------------
TAB
B
0
1
TAB
B
1
10000
在没有直方图的情况下,在B
列上进行等值查询的时候,都是索引范围扫描。
SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569
----------------------------------------------------------------------------------------
| Id | Operation
| Name |
Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| | 1000
| 6000 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB
| 1000 | 6000 |
4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN
| IX_TAB_B | 1000 | |
2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
SQL> select * from tab where b=5;
已选择9991
行。
执行计划
----------------------------------------------------------
Plan hash value: 439197569
----------------------------------------------------------------------------------------
| Id | Operation
| Name |
Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| | 1000
| 6000 | 4 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB
| 1000 | 6000 |
4 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN
| IX_TAB_B | 1000 | |
2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
收集直方图信息。看看是什么效果。由于列B
唯一值的个数没有超过254
因此产生的是等频直方图。
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
TABNAME => 'TAB',
CASCADE
=> TRUE,
METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO ');
END;
在B=1
时候采用索引扫描,而B=5
时候,已经采用全表扫描了,说明直方图起了作用。
SQL> select * from tab where b=1;
执行计划
----------------------------------------------------------
Plan hash value: 439197569
----------------------------------------------------------------------------------------
| Id | Operation
| Name |
Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
| | 1
| 6 | 2 (0)|
00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TAB
| 1 | 6
| 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN
| IX_TAB_B | 1 |
| 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
SQL> select * from tab where b=5;
已选择9991
行。
执行计划
----------------------------------------------------------
Plan hash value: 1995730731
--------------------------------------------------------------------------
| Id | Operation | Name |
Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT |
| 9991 | 59946 | 6 (0)|
00:00:01 |
|* 1 | TABLE ACCESS FULL|
TAB | 9991 | 59946 | 6
(0)| 00:00:01 |
--------------------------------------------------------------------------
查看此时的直方图信息:
SQL>SELECT TABLE_NAME, COLUMN_NAME, ENDPOINT_NUMBER, ENDPOINT_VALUE FROM
USER_TAB_HISTOGRAMS
WHERE TABLE_NAME = 'TAB'
;
TABLE_NAME
COLUMN_NAME
ENDPOINT_NUMBER ENDPOINT_VALUE
------------------------------ ----------------------------------------
--------------- --------------
TAB
B
1
1
TAB
B
2
2
TAB
B
3
3
TAB
B
4
4
TAB
B
9995
5
TAB
B
9996
9996
TAB
B
9997
9997
TAB
B
9998
9998
TAB
B
9999
9999
TAB
B
10000
10000
其中EDNPOINT_NUMBER
是累计值。EDNPOINT_VALUE
是列的值。可以看出这种等频直方图统计的列
的信息是非常精确的。它为每一个列值分配了一个桶。从执行计划的ROWS
部分也可以看出ORACLE
计算出来的cardinality
是9991
,和实际 的情况完全吻合。
如果想知道每一个列值对应的数量是多少,需要做一下简单的减法运算:
假如想知道列值等于5
的个数,那么可以通过:
9995-4=9991
得到。这就是ENDPOINT_NUMBER
累计值的含义。
在看看等高直方图的情况。 |
> 1.
如果列B
有新的数据插入或者更新,直方图会随之更新吗?
It won't automatically. You have to manually gather stats again. Your DB may
have a 10pm nightly job to do it too.
> 2.
在列B
上建位图索引能否解决同样的问题?
A bitmap index? Why do you think so?
> 10.2.0.4
中在建立直方图后,还是使用索引,请问哪位知道是为什么?
Can you show us the sqlplus screen (text, not image)? I'd like to reproduce on
my end.
发表评论
-
MySQL创建用户与授权
2015-12-08 19:19 1317一, 创建用户: 命令:CREATE USE ... -
数据库的拆分
2014-07-24 17:07 1119http://blog.csdn.net/bluishgl ... -
数据库事务隔离级别
2014-07-24 16:09 1047转自:http://singo107.iteye.com/b ... -
聚集索引和非聚集索引
2013-07-23 15:53 1864聚集索引和非聚集索引 聚集索引:表的物理存储按照 ... -
索引介绍
2013-07-23 14:39 1108按逻辑上来分: ... -
分区索引
2013-07-23 10:47 1252分区索引分为本地(loca ... -
反向键索引的原理和用途
2013-07-22 20:00 7293我们知道Oracle会自动为表的主键列建立索引,这个默认的 ... -
B树索引、位图索引和散列索引
2013-07-19 17:44 29823索引在数据结构上可以分为三种B树索引、位图索引和散列索引 ... -
SQLPLUS相关命令
2013-07-17 17:55 1119登录 sqlplus test/test123@MyD ... -
oracle trace文件查看
2013-07-17 17:51 1313CALL:每次SQL语句的处理都分成三个部分Parse:这步将 ... -
not in和not exists的区别
2013-05-27 13:59 2605先创建测试数据: create table test ... -
Latch (转)
2013-05-24 15:33 2498一. Latch 说明 1.1 Latc ... -
深度分析数据库的热点块问题(转)
2013-05-24 14:13 1439热点块的定义 ... -
join 条件在on和where 后的区别
2013-05-22 16:53 1274首先建两个表来测试下。 create table a( ... -
如何设计索引
2013-05-21 16:06 1631一个表建多少索引合适 ... -
重建索引
2013-05-20 23:30 1403关于索引重建,只需要记住一条: 如果它没坏,就不要 ... -
B+树索引
2013-05-20 16:10 147111.索引结构 1.1 B+树 ... -
ORACLE 循环
2012-10-12 18:39 12061、 Exit When 循环: ... -
高水位线
2012-10-08 16:38 1125所有的 oracle 段都有一个在段内容纳数据的上限 ... -
imp/exp命令导入导出数据
2012-09-25 17:30 1065导出数据: 1 将数据库TEST完全导出,用户名syste ...
相关推荐
### 结合实例深入讲解Oracle中的直方图Histogram #### 一、直方图的基本概念 直方图是一种统计图表,在多种领域中都有广泛的应用,它并非Oracle数据库所独有的功能。直方图通常用来描绘一组数据的分布情况,通过一...
Oracle 直方图计算公式,对于Oracle cbo优化器的探究又进入一步
### Oracle直方图解析深度解读 #### 一、直方图概述 直方图作为一种统计学工具,在Oracle数据库中扮演着关键角色。本质上,直方图是对数据分布情况的一种图形化表示,它通过一系列相连的矩形来展示数据在各个区间...
Oracle直方图是数据库优化的重要工具,特别是在Oracle关系型数据库中,它对于Cost-Based Optimizer (CBO)的成本估算起到关键作用。直方图能够帮助CBO更准确地理解数据表列的数据分布,从而制定出更高效的查询执行...
在探讨Oracle优化直方图之前,需要对优化器的概念有所了解。优化器在数据库中扮演着非常重要的角色,它负责生成执行计划,决定如何高效地从数据库中检索数据。优化器有两种类型:基于规则的优化器(RBO)和基于成本...
### Oracle CBO优化器与直方图(Histogram)解析 #### 概述 在数据库管理领域,Oracle CBO(Cost-Based Optimizer)成本基于优化器是Oracle数据库管理系统中用于确定查询执行计划的一种重要机制。通过分析SQL语句,...
数据可以从数据库查询得到,通过ADO.NET连接Oracle数据库,执行SQL语句获取数据,然后对数据进行分组和计算频率,最后根据结果绘制直方图。 饼图则用于显示一个数据系列中各项的大小与各项总和的比例关系。在C#中,...
标题中提及的“一个直方图问题引发的思考”指向的是在Oracle数据库环境下,对直方图和SQL执行计划的深入分析和优化过程。直方图是Oracle数据库中用于记录列内值分布的统计工具,它在优化器选择执行计划时起到关键...
在使用直方图时,Oracle优化器会根据直方图信息来调整其基数估计方法,以便更准确地预测查询结果的行数。这些调整包括对特定查询谓词(如等值、范围和不等于)的处理。 例如,对于等值谓词,优化器将基于直方图的桶...
文章提到,收集准确的统计信息,特别是直方图的收集,对于Oracle能否选择最优的执行计划至关重要。通过实验验证,直方图对SQL执行计划的影响非常明显,可以清楚地指导数据库管理员在哪些情况下需要收集直方图。 ...
总结来说,直方图在Oracle数据库中对执行计划有着显著影响。它可以纠正CBO对数据分布的错误假设,避免因数据倾斜而导致的不理想执行计划,如全表扫描,而选择更适合的索引操作。在处理倾斜数据或需要精确统计信息的...
在图像处理领域,RAW图像和BMP文件是两种常见的格式,它们各有特点,适用于不同的应用场景。本教程将深入探讨如何使用C++编程语言从RAW格式转换为BMP格式,这对于理解图像处理的基本原理以及开发相关应用非常有帮助...
3. **直方图统计**:支持创建直方图来更好地描述列值的分布情况,这对于处理数据倾斜的情况非常有用。 #### 五、`dbms_stats`的主要参数详解 - **options参数**:控制Oracle统计的刷新方式。提供了四种预设方法: ...
- 介绍了直方图(Histogram)的概念、收集方法及其对选择性的影响。 - 讨论了表连接的不同方式,如排序-合并连接(SMJ)、嵌套循环(NL)、哈希连接(HJ)等,并比较了它们的特点。 - 分析了笛卡儿乘积产生的原因...
影响Oracle数据库索引的几个因素包括选择性、集群因子、二元高度和直方图等。本文通过对索引的概念和作用的剖析,以及对影响索引的几个因素的分析,旨在帮助数据库管理员更好地理解和应用索引技术。 六、参考文献 ...
- 直方图可以帮助Oracle更准确地估计查询的行数。 - 聚簇因子表示索引条目与实际数据之间的距离,其值越低表明索引的效率越高。 - 动态采样技术可以使Oracle更精确地估算查询成本,从而选择更优的执行计划。 - *...
综上所述,Oracle SQL的规则与优化涉及了从SQL语句的分类、执行流程、解析策略到绑定变量的使用、直方图的构建等多个方面。理解并熟练应用这些知识点,不仅可以提升SQL执行效率,还能为整个系统的性能优化打下坚实的...