日期:2014-05-16  浏览次数:20401 次

analyze和dbms_stats函数的区别

analyze和dbms_stats函数都是收集一些统计信息,如下:

select table_name, num_rows, blocks, avg_row_len
  from user_tables
 where table_name = 'T';

?

?
analyze table t compute statistics;

?

?
删除统计信息
analyze table t delete statistics;

?

用dbms_stats函数如下:

SQL> exec dbms_stats.gather_table_stats(user,'T');

?

得到的结果和analyze相同。

?

一般对于常规的使用(不考虑分区表,外部表等特性),使用Analyze可以帮助我们得到我们需要的数据。细微的区别如下:

一、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句

  1. 可以并行进行,对多个用户,多个Table
  2. 可以得到整个分区表的数据和单个分区的数据。
  3. 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
  4. 可以倒出统计信息
  5. 可以用户自动收集统计信息

二、DBMS_STATS的缺点

  1. 不能Validate Structure
  2. 不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
  3. DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True

三、对于oracle 9版本后面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。

?

?