Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7068632
  • 博文数量: 702
  • 博客积分: 10821
  • 博客等级: 上将
  • 技术积分: 12031
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-02 10:41
个人简介

中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。

文章分类

全部博文(702)

分类: Oracle

2013-09-30 14:54:34

  • 自从Oracle8.1.5引入dbms_stats包,Experts们便推荐使用dbms_stats取代analyze。 理由如下

  • dbms_stats可以并行分析
  • dbms_stats有自动分析的功能(alter table monitor )
  • analyze 分析统计信息的不准确some times


  • 1,2好理解,且第2点实际上在VLDB中是最吸引人的;3以前比较模糊,看了metalink236935.1 解释,analyze在分析Partition表的时候,有时候会计算出不准确的Global statistics .

  • 原因是,dbms_stats会实在的去分析表全局统计信息(当指定参数);而analyze是将表分区(局部)的statistics 汇总计算成表全局statistics ,可能导致误差。

  • 如果想分析整个用户或数据库,还可以采用工具包,可以并行分析
  • Dbms_utility(8i以前的工具包)
  • Dbms_stats(8i以后提供的工具包)

  • dbms_stats.gather_schema_stats(User,estimate_percent=>100,cascade=> TRUE);
  • 分区表推荐用:
        EXEC dbms_stats.gather_table_stats(ownname => 'SCHEMA',
                                                                        tabname => 'TABLE_NAME',
                                                                        cascade => TRUE,
                                                                        degree => number of cpu,
                                                                        estimate_percent => 100);

    一般的表(tom高效设计中的方法):
        analyze table table_name compute statistics for table for all indexes for all indexed columns;


  • dbms_stats.gather_table_stats(User,TableName,degree => 4,cascade => true);

  • 这是对命令与工具包的一些总结

  • 1、对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
  • a) 可以并行进行,对多个用户,多个Table
  • b) 可以得到整个分区表的数据和单个分区的数据。
  • c) 可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
  • d) 可以倒出统计信息
  • e) 可以用户自动收集统计信息

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

  • 3、对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。
  • 阅读(7886) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~