关于收集信息的dbms_stats包和analyze功能简述:
自从Oracle 8.1.5引入了dbms_stats包,ORACLE及专家们推荐使用dbms_stats取代analyze,理由如下:
1. dbms_stats可以并行分析
2. dbms_stats有自动分析的功能(alter table monitor )
3. analyze分析统计信息的有些时候不准确
第1,2比较好理解,且第2点实际上在VLDB(Very Large Database)中是最吸引人的;3以前比较模糊,看了metalink236935.1解释,analyze在分析Partition表的时候,有时候会计算出不准确的Global statistics。原因是dbms_stats会实在的去分析表全局统计信息(当指定参数);而analyze是将表分区(局部)的statistics汇总计算成表全局statistics,可能导致误差。没有分区表的情况下两个都可以使用(看个人习惯,当然也可以分区表使用dbms_stats,其他使用analyze )。
不过在一些论坛上也有看到dbms_stats分析之后出现统计数据不准确的情况,而且确实有bug在dbms_stats上(可能和版本有关,有待查明),应该是少数情况,需要我们注意。还有,一般不建议analyze和dbms_stats混用。 实验: 如果在分区表上用dbms_stats统计后,再使用analyze table来统计,就会出现表信息不被更新的问题。删除统计信息后再分析就更新了,或者直接用dbms_stats分析。dbms_stats目前有遇到的bug例子如下:
http://www.itpub.net/viewthread.php?tid=959290&highlight=dbms%5C_stats
dbms_stats包可以分析table、Index或者整个用户(schema),数据库,可以并行分析。不同版本包有些不一样,dbms_utility (8i以前的工具包),dbms_stats (8i或以后提供的工具包),具体的dbms_stats包的众多功能介绍见后面。
对命令与工具包的一些总结:
1、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
a)可以并行进行,对多个用户,多个Table
b)可以得到整个分区表的数据和单个分区的数据。
c)可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
d)可以导出统计信息
e)可以用户自动收集统计信息(alter table monitor )
2、DBMS_STATS的缺点:
a)不能Validate Structure (注意:validate structure主要在于校验对象的有效性. compute statistics在于统计相关的信息)。
b)不能收集CHAINED ROWS(行链接),不能收集CLUSTER TABLE(簇表)的信息,这两个仍旧需要使用Analyze语句。
c) DBMS_STATS默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True。即GATHER_TABLE_STATS:分析表信息,当cascade为true时,分析表、列(索引)信息。
Analyze是同时更新表和索引的统计信息,而dbms_stats会先更新表的统计信息,然后再更新索引的统计信息(默认Cascade是False),这里就有一个问题,就是当表的统计信息更新后,而索引的统计信息没有被更新,这时候cbo就有可能选择错误的plan 。
3、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。
Analyze命令语法如下:
ANALYZE
{ TABLE [ schema.]table
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| INDEX [ schema. ]index
[ PARTITION ( partition ) | SUBPARTITION ( subpartition ) ]
| CLUSTER [ schema. ]cluster
}
{ COMPUTE [ SYSTEM ] STATISTICS [for_clause]
| ESTIMATE [ SYSTEM ] STATISTICS [for_clause][SAMPLE integer { ROWS | PERCENT }]
| validation_clauses
| LIST CHAINED ROWS [ into_clause ]
| DELETE [ SYSTEM ] STATISTICS
} ;
dbms_stats所有的功能包如下:
GATHER_INDEX_STATS:分析索引信息
GATHER_TABLE_STATS:分析表信息,当cascade为true时,分析表、列(索引)信息
GATHER_SCHEMA_STATS:分析方案信息
GATHER_DATABASE_STATS:分析数据库信息
GATHER_SYSTEM_STATS:分析系统信息
EXPORT_COLUMN_STATS:导出列的分析信息
EXPORT_INDEX_STATS:导出索引分析信息
EXPORT_SYSTEM_STATS:导出系统分析信息
EXPORT_TABLE_STATS:导出表分析信息
EXPORT_SCHEMA_STATS:导出方案分析信息
EXPORT_DATABASE_STATS:导出数据库分析信息
IMPORT_COLUMN_STATS:导入列分析信息
IMPORT_INDEX_STATS:导入索引分析信息
IMPORT_SYSTEM_STATS:导入系统分析信息
IMPORT_TABLE_STATS:导入表分析信息
IMPORT_SCHEMA_STATS:导入方案分析信息
IMPORT_DATABASE_STATS:导入数据库分析信息
关于analyze语句与dbms_stats包的区别,这部分内容我借鉴了的博客,地址是http://blog.chinaunix.net/u3/112694/showart_2210594.html,他上面有更详细的analyze的用法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10356975/viewspace-680353/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/10356975/viewspace-680353/