- 浏览: 1064269 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
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 1284一, 创建用户: 命令:CREATE USE ... -
数据库的拆分
2014-07-24 17:07 1081http://blog.csdn.net/bluishgl ... -
数据库事务隔离级别
2014-07-24 16:09 1011转自:http://singo107.iteye.com/b ... -
聚集索引和非聚集索引
2013-07-23 15:53 1815聚集索引和非聚集索引 聚集索引:表的物理存储按照 ... -
索引介绍
2013-07-23 14:39 1069按逻辑上来分: ... -
分区索引
2013-07-23 10:47 1203分区索引分为本地(loca ... -
反向键索引的原理和用途
2013-07-22 20:00 7226我们知道Oracle会自动为表的主键列建立索引,这个默认的 ... -
B树索引、位图索引和散列索引
2013-07-19 17:44 29750索引在数据结构上可以分为三种B树索引、位图索引和散列索引 ... -
SQLPLUS相关命令
2013-07-17 17:55 1070登录 sqlplus test/test123@MyD ... -
oracle trace文件查看
2013-07-17 17:51 1267CALL:每次SQL语句的处理都分成三个部分Parse:这步将 ... -
not in和not exists的区别
2013-05-27 13:59 2543先创建测试数据: create table test ... -
Latch (转)
2013-05-24 15:33 2427一. Latch 说明 1.1 Latc ... -
深度分析数据库的热点块问题(转)
2013-05-24 14:13 1394热点块的定义 ... -
join 条件在on和where 后的区别
2013-05-22 16:53 1222首先建两个表来测试下。 create table a( ... -
如何设计索引
2013-05-21 16:06 1589一个表建多少索引合适 ... -
重建索引
2013-05-20 23:30 1354关于索引重建,只需要记住一条: 如果它没坏,就不要 ... -
B+树索引
2013-05-20 16:10 146241.索引结构 1.1 B+树 ... -
ORACLE 循环
2012-10-12 18:39 11631、 Exit When 循环: ... -
高水位线
2012-10-08 16:38 1086所有的 oracle 段都有一个在段内容纳数据的上限 ... -
imp/exp命令导入导出数据
2012-09-25 17:30 1023导出数据: 1 将数据库TEST完全导出,用户名syste ...
相关推荐
文章内容转载自网络。 从直方图的概念 直方图的作用、使用场合……等内容深入分析了oracle直方图,并给出了操作实例,建议收藏备查。
Oracle直方图的详细解析,详细解析Oracle直方图的来龙去脉
Oracle 直方图计算公式,对于Oracle cbo优化器的探究又进入一步
Oracle 直方图解析.pd
Oracle直方图.pdf
【Maclean Liu技术分享】拨开Oracle CBO优化器迷雾,探究Histogram直方图之秘 20130429
【Maclean Liu技术分享】拨开Oracle CBO优化器迷雾,探究Histogram直方图之秘_0321.pdf
用C#绘制直方图,饼图,曲线图,里面谢了一个方法可以连接oracle数据库查询数据,进行绘制。
如果对目标收集了直方图,则意味着CBO不再认为目标列上的数据是均匀分布的。CBO会用该列上的直方图的统计信息计算返回结果集的cardinality. 验证直方图对执行计划的影响步骤: 1、创建一张表T1 2、往表中插入倾斜度...
2015 Oracle 技术嘉年华(OTN)分会场12乔晓阳 - 一个直方图问题引发的思考
其中主要包括收集数据库统计系统、收集列直方图、分析SQL执行计划、如何让CBO优化器选择最优的执行计划,以及如何使用Hint提示认为改变CBO优化器的执行计划等,希望此文档能够帮助大家更深入地理解Oracle优化!
这是一个读取12位RAW图像,并将其转换为BMP文件的程序,供新手学习使用
还有我们可以考虑我们的哪些列上需要直方图,对于bucket的个数问题,oracle的默认值是75个,所以根据你的应用规则,选择合适的桶数对性能也是有帮助的。因为不必要的桶的个数的大量增加,必然会带来SQL语句硬解析时...
7.1 直方图 141 7.2 dbms_stats包 147 7.3 动态采样 176 7.3.1 什么是动态采样 176 7.3.2 动态采样的级别 182 7.3.3 什么时候使用动态采样? 185 7.4 小结 185 第8章 并行执行 186 8.1 并行和olap系统 187 8.2 并行...
7.2.2 Oracle何时忽略直方图 149 7.3 频率直方图 152 7.3.1 伪造频率直方图 155 7.3.2 注意事项 156 7.4 “高度均衡”直方图 157 7.5 重新审视数据问题 163 7.5.1 愚蠢的数据类型 163 7.5.2 危险的默认值 166 7.6 本...
2019年Oracle Open World大会PPT合集(50份) DBA未来的工作方向及技能要求 Exadata性能诊断 MySQL性能优化可扩展性 ...MySQL 8.0 有了直方图信息可快速检索几十亿商品信息 MySQL8.0 外键增强 等等
7.1 直方图 141 7.2 dbms_stats包 147 7.3 动态采样 176 7.3.1 什么是动态采样 176 7.3.2 动态采样的级别 182 7.3.3 什么时候使用动态采样? 185 7.4 小结 185 第8章 并行执行 186 8.1 并行和olap系统 187 8.2 并行...
本例使用DBChart为基础,可配置连接Oracle、MySQL、SQL Server以及Access数据库。根据用户配置的语句,生成数据图表。