1. 有什么样的方法来判断一个数据库库表是否需要来做统计更新呢?
2. 如何来检测统计更新的效果?
3.统计更新的方法是什么:analyze table 表名 compute statistics;
还是:EXEC dbms_stats.gather_table_stats('用户名',‘表名’),这两种方法有区别吗?
如何检测两者的效果

解决方案 »

  1.   

    1,系统一般会自动更新统计信息。除非有大量频繁的删改操作,统计信息会有出错或延时。
    2,可以看下all_tables下面的数据量和实际的数据量是否有差距。当然还有别的方式,待大神回复
    3,更新的方式这两者没什么差距,只是一个是老版本一个是新版本的,机制应该差不多。
      

  2.   

    1、判断是否需要再次收集统计信息很难,因为统计信息是否合理,要看最终sql执行的性能如何,说难听点,如果从始至终sql性能都可以接受,那么不收集统计信息,或者收集一次统计信息,甚至锁定统计信息都无所谓。这个最好要先定一个粗犷的频率,然后由一线的运维来细化更好;
    2、更新的效果指的是什么?是是否更新?还是更新是否正确?不同的统计信息存放在不同的数据字典里,包括user_tables、user_tab_partitions、user_tab_subpartitions、user_indexes、user_tab_col_statistics等等,对于表,最简单暴力看它统计信息是否在最近被更新,可以查看user_tables.last_analyzed字段,这个代表最近一次收集统计信息的时间;
    3、建议使用dbms包来收集统计信息,因为至少可以并行,对于分区表的统计信息收集也更准确(可以指定更细粒度的分区层级)