设为首页 加入收藏

TOP

Oracle性能分析12:对象统计信息(二)
2015-07-24 11:02:22 来源: 作者: 【 】 浏览:6
Tags:Oracle 性能 分析 对象 统计 信息
计信息中就可以得到。但如果数据不是均匀分布的,查询优化器则需要额外的信息才能做出正确估算。
这些查询优化器需要的关于数据不均匀分布的额外信息叫做直方图,存在两种类型的直方图:频度直方图(frequency histogram)和等高直方图(height-balanced histogram)。

频度直方图

频度直方图的本质特性如下:
1)桶数(即分类数)等于唯一值总数。对于每个桶来说,视图user_tab_histograms有一行数据与之对应;
2)列endpoint_value提供该值本身。该列为number类型,应此非数字类型的列必须要进行转换,只取前六个字节。这意味着直方图中存储的值的分布是基于列的前面部分,因而,固定前缀的字符串会使直方图的分布严重不均衡;
3)列endpoint_number是取值的累积出现次数,当前的endpoint_number减去上一个endpoint_number,就是当前行这个值的出现次数。
通过下面的方式就可以得到列val2的频次:

select column_name,
       endpoint_value,
       endpoint_number,
       endpoint_number - lag(endpoint_number, 1, 0) over(order by endpoint_number) as frequency
  from user_tab_histograms
 where table_name = 'TEST'
   and column_name = 'VAL2'
 order by endpoint_number

COLUMN_NAME	ENDPOINT_VALUE	ENDPOINT_NUMBER	FREQUENCY
-------------------------------------------------------
VAL2				101				8			8
VAL2				102				33			25
VAL2				103				101			68
VAL2				104				286			185
VAL2				105				788			502
VAL2				106				1000		212

下面用test表作为一个例子说明优化器怎样利用频度直方图精确估算查询返回的行数:

explain plan set statement_id '101' for select * from test where val2 = 101;
explain plan set statement_id '102' for select * from test where val2 = 102;
explain plan set statement_id '103' for select * from test where val2 = 103;
explain plan set statement_id '104' for select * from test where val2 = 104;
explain plan set statement_id '105' for select * from test where val2 = 105;
explain plan set statement_id '106' for select * from test where val2 = 106;

然后我们查看执行计划对返回行数的估算:

select statement_id,cardinality from plan_table where id = 0;

STATEMENT_ID	CARDINALITY
----------------------------------
	101			8
	102			25
	103			68
	104			185
	105			502
	106			212

等高直方图

当一列的唯一值数量总是大于桶的允许最大数量(254)时,就不能使用频度直方图了,这是就只能使用等高直方图了。
等高直方图的主要特征如下:
1)桶数少于唯一值总数。除非被压缩,否则对应于每个桶,视图user_tab_histograms里都有一个包含端点号(endpoint number)的行与之对应,端点号0表明最小取值;
2)端点值(endpoint_value)就是列的数值。因为该列是number类型,非数字类型必须进行转换,此值仅取前六个字节;
3)endpoint_number列给出了桶号;
4)直方图不存储一个取值的频度。
等高直方图只存储列值属于某一个桶,如果有两个列值位于同一个桶,则其中一个将被忽略(压缩),这样的统计就可能导致估算不准确。在实践中,等高直方图不但可能导致错误的估算,还可能引起查询优化器估值的不稳定。

索引统计信息

下面的查询可以得到索引统计信息:

select index_name,
       blevel,
       leaf_blocks,
       distinct_keys,
       num_rows,
       clustering_factor,
       avg_leaf_blocks_per_key,
       avg_data_blocks_per_key
  from user_ind_statistics
 where table_name = 'TEST';

主要字段的含义如下:
1)blevel:为了访问叶子块而需要读取的分支块的数量,包括根块;
2)leaf_blocks:索引中的叶子块数;
3)distinct_keys:索引中的唯一键值总数;
4)num_rows:索引中的键值数;
5)clustering_factor:见“Oracle性能分析8:使用索引”http://blog.csdn.net/tomato__/article/details/39294655;
6)avg_leaf_blocks_per_key:存放一个键值的平均叶子块数,公式如下;
avg_leaf_blocks_per_key = leaf_blocks/distinct_keys
7)avg_data_blocks_per_key:表中单个键引用的平均数据块数,公式如下:
avg_data_blocks_per_key = clustering_factor/distinct_keys


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇oracle视图总结(创建、查询、修.. 下一篇oracleceil取整

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python爬虫教程(从 (2025-12-26 16:49:14)
·【全269集】B站最详 (2025-12-26 16:49:11)
·Python爬虫详解:原 (2025-12-26 16:49:09)
·Spring Boot Java: (2025-12-26 16:20:19)
·Spring BootでHello (2025-12-26 16:20:15)