一.直方图作用:
在
中直方图是一种对数据分布情况进行描述的工具。它会按照某一列不同值出现
数量多少,以及出现的频率高低来绘制数据的分布情况,以便能够指导优化器根据数据的
分布做出正确的选择。数据出现倾斜时,优化器表的列中的数值分布将会影响优化器使用
索引还是执行全表扫描的决策,这种情况下如果
子句的过滤谓词列之上有一个合
理的正确的直方图,将会对优化器做出正确的选择发挥巨大的作用,使得
语句执行成
本最低,从而提升性能
二.直方图使用场合:
当
子句引用了列值分布存在明显偏差的列时:当这种偏差相当明显时,以至于
子句中的值将会使优化器选择不同的执行计划。这时应该使用直方图来帮助优化
器来修正执行路径。(注意:如果查询不引用该列,则创建直方图没有意义。这种错误很
常见,许多
会在偏差列上创建柱状图,即使没有任何查询引用该列。)
多表连接时,表的连接列的列值会影响
的判断。例如
假设我们有一个五项的表联
接,其结果集只有
10
行。
Oracle
将会以一种使第一个联接的结果集(集合基数)尽可能
小的方式将表联接起来。通过在中间结果集中携带更少的负载,查询将会运行得更快。为
了使中间结果最小化,优化器尝试在
SQL
执行的分析阶段评估每个结果集的集合基数。
在偏差的列上拥有直方图将会极大地帮助优化器作出正确的决策。如优化器对中间结果集
的大小作出不正确的判断,它可能会选择一种未达到最优化的表联接方法。因此向该列添
加直方图经常会向优化器提供使用最佳联接方法所需的信息。
三.直方图种类:
频率直方图(
)与高度平衡直方图(
)
频率直方图,也叫宽度平衡直方图。针对包含很少不同值的列,每一个
值占一个
!
。
BUCKET
数
=
表的
NUM_DISTINCT
值。
!
可以理解为存储数据的容器,
这个容器会按照数据的分布将数据尽量平均到各个桶里。
高度均衡直方图针对包含很多不同值的列。通常情况下当
BUCTET <
表的
NUM_DISTINCT
值得到的是
HEIGHT BALANCED
(高度平衡)直方图。
默认情况时,
的直方图会产生
"#
个存储桶。最多产生
#$
个桶。但是如果列中有
%&'&&
个不同值时,还是无法创建
()*+
(频率)直方图
,
此时需要手工建立
直方图
-
并写入数据字典方能完成
()*+
(频率)直方图的创建。
直方图统计信息
评论