对象统计信息分为三种类型:表统计信息、列统计信息以及索引统计信息。对于每种类型,又分为多达三种子类型:表/索引级别统计信息、分区级别统计信息以及子分区级别统计信息。显而易见,分区和子分区统计信息只有当对象分别进行了分区和划分了子分区时才可用。
对象统计信息通过表8-2中列举的数据字典视图来显示。当然,对于每一个视图都有dba、all,在12.1多租户环境下还有cdb版本可用,例如dba_tab_statistics、all_tab_statistics和cdb_tab_statistics。
表8-2 显示对象统计信息的数据字典视图关系表
|
对 象 |
表/索引级别统计信息 |
分区级别统计信息 |
子分区级别统计信息 |
|
表 |
user_tab_statistics |
user_tab_statistics |
user_tab_statistics |
|
列 |
user_tab_col_statistics |
user_part_col_statistics |
user_subpart_col_statistics |
|
user_tab_histograms |
user_part_histograms |
user_subpart_histograms |
|
|
索引 |
user_ind_statistics |
user_ind_statistics |
user_ind_statistics |
BEGIN
dbms_stats.gather_table_stats(ownname => user,
tabname => 'T',
estimate_percent => dbms_stats.auto_sample_size,
method_opt => 'for columns size skewonly id,
val1 size 15, val2, val3 size 5, pad',
cascade => TRUE);
END;
/
接下来的查询展示了如何获取对于一张表来说最重要的表统计信息:
select
num_rows,blocks,empty_blocks,avg_space,chain_cnt,avg_row_len
FROM user_tab_statistics
WHERE table_name='T';
下面是对于查询返回的表统计信息的说明。
Ø num_rows 是表中的数据行数量。
Ø blocks 是表中高水位线以下数据块的数量。
Ø empty_blocks 是表中高水位线以上数据块的数量。dbms_stats包不会将这个值计算在内。这个值会被设置为0(除非有另外一个值已经存在于数据字典中)。
Ø avg_space 是表的数据块中的平均空闲空间(按字节表示)。 dbms_stats包不会将这个值计算在内。这个值会被设置为0(除非有另外一个值已经存在于数据字典中)。
Ø chain_cnt 是表中链接和迁移到另一个块的数据行的总数。即使查询优化器使用这个值, dbms_stats包也不会将其计算在内。它会被设置为0(除非有另外一个值已经存在于数据字典中)。
Ø avg_row_len 是表中数据行的平均大小(按字节表示)。
高水位线
高水位线是段(segment)中已使用空间和未使用空间的分界线。已使用的块位于高水位线以下,未使用的块位于高水位线以上。高水位线以上的块从未被使用过或者初始化过。
通常情况下,请求空间的操作(例如,INSERT语句)只有当高水位线以下没有更多的空闲空间时才会提高高水位线。这里有一个常见的例外是在直接路径插入期间,因为它们专门使用高水位线以上的块。
释放空间的操作(例如DELETE语句)并不会降低高水位线。它们只是使空间对其他操作可用。如果释放空闲空间的速率等于或低于重用空间的速率,那么使用高水位线以下的数据块应该是最理想的。
否则,高水位线以下的空闲空间会稳步增长。从长远来看,这样不仅会造成段大小的不必要增大,同时也会导致性能不理想。实际上,全表扫描会访问高水位线以下的所有块。即使这些块是空的也会扫描。应该通过重构段来解决这个问题。




