设为首页 加入收藏

TOP

Oracle性能分析12:对象统计信息(一)
2015-07-24 11:02:22 来源: 作者: 【 】 浏览:2
Tags:Oracle 性能 分析 对象 统计 信息

对象统计信息描述数据是如何在数据库中存储的,查询优化器使用这些统计信息来做出正确的决定。Oracle中有三种类型的对象统计信息:表统计、列统计和索引统计。而在每种类型中,有细分为:表或索引级别的统计、分区级别统计和子分区级别的统计,后面两种只有在对象被分区和具有子分区的情况下才可用。

统计信息相关视图

表统计信息

表/索引级别的统计

user_tab_statistics
user_tables

分区级别的统计

user_tab_statistics
user_tab_partitions

子分区级别统计

user_tab_statistics
user_tab_subpartitions

列统计信息

表/索引级别的统计

user_tab_col_statistics
user_tab_histograms

分区级别的统计

user_part_col_statistics
user_part_histograms

子分区级别统计

user_subpart_col_statistics
user_subpart_histograms

索引统计信息

表/索引级别的统计

user_ind_statistics
user_indexes

分区级别的统计

user_ind_statistics
user_ind_partitions

子分区级别统计

user_ind_statistics
user_ind_subpartitions

创建测试表

这里将创建测试表T用于后面对统计信息的说明。

创建测试表

create table test as 
select rownum as id,
       round(dbms_random.normal * 1000) as val1,
       100 + round(ln(rownum / 3.25 + 2)) as val2,
       100 + round(ln(rownum / 3.25 + 2)) as val3,
       dbms_random.string('p', 250) as pad
  from all_objects
 where rownum <= 1000
 order by dbms_random.value

上面的语句创建了一个1000行的表,然后我们将val1列中的负值清空:

update test set val1 = null where val1 < 0;

为测试表添加主键和索引

alter table test add constraint test_pk primary key (id);
create index test_val1 on test (val1);
create index test_val2 on test (val2);

为测试表收集统计信息

begin
  dbms_stats.gather_table_stats(ownname          => user,
                                tabname          => 'TEST',
                                estimate_percent => 100,
                                method_opt       => 'for all columns size skewonly',
                                cascade          => TRUE);
end;

表统计信息

下面是表统计信息中的关键字段:

select num_rows, blocks, empty_blocks, avg_space, chain_cnt, avg_row_len
  from user_tab_statistics
 where table_name = 'TEST';
 
NUM_ROWS	BLOCKS	EMPTY_BLOCKS	AVG_SPACE	CHAIN_CNT	AVG_ROW_LEN
----------------------------------------------------------------------------------
1000		39		0				0			0			265

下面是对字段含义的解释:

1)num_rows:表中数据的行数;
2)blocks:高水位线以下的数据块个数(高水位线详见“Oracle性能分析4:数据访问方法之全扫描”http://blog.csdn.net/tomato__/article/details/38981425);
3)empty_blocks:高水位线以上的数据块个数,由于dbms_stats不计算该值,因此为0;
4)avg_space:表里数据块的平均空闲空间(字节),由于dbms_stats不计算该值,因此为0;
5)chain_cnt:涉及行链接和行迁移的总行数,由于dbms_stats不计算该值,因此为0(详见“Oracle行迁移和行链接”http://blog.csdn.net/tomato__/article/details/40146573);
6)avg_row_len:表中平均每个记录的长度(字节)。

列统计信息

下面是列统计信息的最重要的统计信息字段:

select column_name,
       num_distinct,
       low_value,
       high_value,
       density,
       num_nulls,
       avg_col_len,
       histogram,
       num_buckets
  from user_tab_col_statistics
 where table_name = 'TEST';

下面是对这些字段的解释:
1)num_distinct:该列中不同值的数量;
2)low_value:该列的最小值。显示为内部存储的格式,对于字符串列只存储前32字节;
3)high_value:该列的最大值。显示为内部存储的格式,对于字符串列只存储前32字节;
4)density:0到1之间的一个小数。接近0表示对于列的过滤操作能去掉大多数行。接近1表示对于该列的过滤操作起不到什么作用。
如果没有直方图,该值的计算方法为:density=1/num_distinct。
如果有直方图,则根据不同的直方图类型有不同的计算方法。
5)num_nulls:该列中存储的NULL的总数;
6)avg_col_len:平均列大小,以字节表示;
7)histogram:表明是否有直方图统计信息,值包括:NONE(没有)、FREQUENCY(频率类型)和HEIGHT BALANCED(平均分布类型);
8)num_buckets:直方图里的bucket的数量,最小为1,最大为254。
注:low_value和high_value表示为内部存储的格式,下面的存储过程可以得到test表的所有列的最大最小值:

declare
  l_val1 test.val1%type;
begin
  for v in (select low_value, high_value
              from user_tab_col_statistics
             where table_name = 'TEST') loop
    dbms_stats.convert_raw_value(v.low_value, l_val1);
    dbms_output.put_line('low value : ' || l_val1);
    dbms_stats.convert_raw_value(v.high_value, l_val1);
    dbms_output.put_line('low value : ' || l_val1);
  end loop;
end;

直方图

查询优化器需要找到满足条件的数据行数,如果列的数据均匀分布的,则很容易根据最小值、最大值和唯一值总数就可以计算得到,这些信息在列统

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

评论

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

·Redis 分布式锁全解 (2025-12-25 17:19:51)
·SpringBoot 整合 Red (2025-12-25 17:19:48)
·MongoDB 索引 - 菜鸟 (2025-12-25 17:19:45)
·What Is Linux (2025-12-25 16:57:17)
·Linux小白必备:超全 (2025-12-25 16:57:14)