使用dbms_stats 还是analyze
自从oracle8.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例子如下:
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)
