常见,许多 DBA 会在偏差列上创建柱状图,即使没有任何查询引用该列 。 )
( 2 ) 、当列值导致不正确的判断时:这种情况通常会发生在多表连接时,例如,假设我
们有一个五项的表联接,其结果集只有 10 行。 Oracle 将会以一种使第一个联接的结果集
(集合基数 ) 尽可能小的方式将表联接起来 。 通过在中间结果集中携带更少的负载 , 查询将
会运行得更快。为了使中间结果最小化,优化器尝试在 SQL 执行的分析阶段评估每个结果
集的集合基数 。 在偏差的列上拥有直方图将会极大地帮助优化器作出正确的决策 。 如优化器
对中间结果集的大小作出不正确的判断,它可能会选择一种未达到最优化的表联接方法 。 因
此向该列添加直方图经常会向优化器提供使用最佳联接方法所需的信息。
四、如何使用直方图
( 1 ) 、创建直方图
通过使用早先的 analyze 命令和最新的 dbms_stats 工具包都可以创建直方图。 Oracl e
推荐使用后者来创建直方图 , 而且直方图的创建不受任何条件限制 , 可以在一张表上的任何
你想创建直方图的列上创建直方图。我们这里主要介绍如何通过 dbms_stats 包来创建直方
图。
Oracle 通过指定 dbms_stats 的 method_opt 参数 , 来创建直方图 。 在 method_opt 子
句中有三个相关选项,即 skewonly 、 repeat 和 auto 。
“ skewonly ” 选项,它的时间性很强,因为它检查每个索引中每列值的分布。如果
dbms_stats 发现一个索引中具有不均匀分布的列,它将为该索引创建直方图,以帮助基于
成本的 SQL 优化器决定是使用索引还是全表扫描访问。示例如下:
begin
dbms_stats. gather_table_stats (
ownname => user,
tabname=>'' ,
estimate_percent =>dbms_stats.auto_sample_size,
method_opt => 'for all columns size skewonly',
cascade=>true,
degree=> 2);
end;
其 中 degre e 指定了并行度视主机 的 CP U 个数而定 , estimate_percen t 指定了采样比率
,
此处使用了 auto 目的是让 oracle 来决定采样收集的比率 , 绘制直方图时会根据采样的数据
分析结果来绘制,当然也可以人为指定采样比率。如: estimate_percent=>20 指定采样比
率为 20% , cascade=>true 指定收集相关表的索引的统计信息,该参数默认为 false ,因此
使用 dbms_stats 收集统计信息时默认是不收集表的索引信息的。
在对表实施监视 (alter table xxx monitoring;) 时使用 auto 选项,它基于数据的
分布以及应用程序访问列的方式 ( 例如由监视所确定的列上的负载 ) 来创建直方图 。 示例如
下:
评论