ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle统计信息

Oracle统计信息

原创 Linux操作系统 作者:xccheese 时间:2012-02-03 13:22:19 0 删除 编辑

Oracle10g的在线文档《Managing Optimizer Statistics》这一章写的比较经典,虽然关键词、知识点很多,但整个文章结构条理化非常清晰,特别是没有复杂的英文单词,总结一下以备后用。

1. 统计信息

Oracle10g里的统计信息按照object和system分类如下:

  • Object statistics
    • Table statistics
    • Column statistics
    • Index statistics
  • System statistics
    • I/O performance and utilization
    • CPU performance and utilization

2. Object的统计信息

Oracle里每个object的统计信息类型如下:

  • Table statistics
    • Number of rows
    • Number of blocks
    • Average row length
  • Column statistics
    • Number of distinct values (NDV) in column
    • Number of nulls in column
    • Data distribution (histogram)
  • Index statistics
    • Number of leaf blocks
    • Levels
    • Clustering factor

系统级别的统计信息主要是性能相关的信息,如下:

  • System statistics
    • I/O performance and utilization
    • CPU performance and utilization

3. 获得统计信息的途径

可以通过以下表或视图查询统计信息

  • DBA_TABLES
  • DBA_OBJECT_TABLES
  • DBA_TAB_STATISTICS
  • DBA_TAB_COL_STATISTICS
  • DBA_TAB_HISTOGRAMS
  • DBA_INDEXES
  • DBA_IND_STATISTICS
  • DBA_CLUSTERS
  • DBA_TAB_PARTITIONS
  • DBA_TAB_SUBPARTITIONS
  • DBA_IND_PARTITIONS
  • DBA_IND_SUBPARTITIONS
  • DBA_PART_COL_STATISTICS
  • DBA_PART_HISTOGRAMS
  • DBA_SUBPART_COL_STATISTICS
  • DBA_SUBPART_HISTOGRAMS

上面这些记忆性的东西是OCP认证考试喜欢挑选的一些知识点!死记硬背确实有点多,平时用的时候查一下资料就行了。

4. 自动收集统计信息

Oracle的GATHER_STATS_JOB会自动收集所有object的统计信息,创建数据库的时候自动创建GATHER_STATS_JOB。

Oracle是否自动收集统计信息涉及到一个重要参数STATISTICS_LEVEL,需要注意:

  • STATISTICS_LEVEL=TYPICAL/ALL,Oracle自动检测统计信息过期并收集
  • STATISTICS_LEVEL=BASIC,Oracle不再自动收集统计信息
  • 默认设置为TYPICAL,设置ALL收集所有相关的统计信息

设置statistics_level参数后,当object一下状态时,GATHER_STATS_JOB会自动收集统计信息:

  • object没有统计信息
  • object统计信息过旧

默认,GATHER_STATS_JOB定制每天晚上22点至凌晨6点运行,周末2天全天运行。stop_on_window_close属性控制JOB的窗口运行状态,默认关闭运行窗口,JOB停止收集统计信息。

常用命令:
---------------------------------------------------------------------------------------------------
查看GATHER_STATS_JOB
SQL> SELECT owner, job_name, enabled, state FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'GATHER_STATS_JOB';

停止GATHER_STATS_JOB
SQL>EXEC DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');

打开GATHER_STATS_JOB
SQL>EXEC DBMS_SCHEDULER.ENABLE('GATHER_STATS_JOB');
---------------------------------------------------------------------------------------------------

5. 手工收集统计信息

一般来说,对于温和增长的数据变化,Oracle的自动收集统计信息功能足以满足需要。什么时候需要收手动集统计信息呢?当出现以下情况时,都需要重新收集statistics:

  • 某些表在自动统计后被delete、truncate或是rebuild
  • 数据增量超过10%,旧的统计信息将不再有效

简单地说就是当数据发生明显改变时,不建议使用automagic statistics gathering,需要根据业务压力和需要手工进行统计信息的更新。

常用命令。使用DBMS_STATS包,实现各个Object统计信息的update、delete、export、import。

Procedure Collects Statistics
GATHER_INDEX_STATS Index statistics
GATHER_TABLE_STATS Table, column, and index statistics
GATHER_SCHEMA_STATS Statistics for all objects in a schema
GATHER_DICTIONARY_STATS Statistics for all dictionary objects
GATHER_DATABASE_STATS Statistics for all objects in a database

6. USER_TAB_MODIFICATIONS

USER_TAB_MODIFICATIONS表记录了数据库里被监控表里的DML操作次数,记录更新不够及时,可以使用Oracle提供的存储过程进行刷新。
---------------------------------------------------------------------------------------------------
查看table的DML操作次数
sql>select table_name,inserts,updates,deletes from user_tab_modifications;

刷新user_tab_modifications的统计信息
sql>exec dbms_stats.flush_database_monitoring_info;

清空user_tab_modifications里表zhangp的统计信息
sql>analyze table zhangp compute statistics;

---------------------------------------------------------------------------------------------------

这个之前不太了解,也是今天才从别人的blog上学习到的。对于性能调优或是测试来说,也可以作为监控热表的一个途径。

Oracle10g的统计信息功能并不是很稳定。我们的生产数据库从9i升级到10g后,就是没有充分考虑到gather statistics的功能和策略上的变化,导致OLTP系统晚上做报表分析时速度巨慢,sql语句的执行计划异常,影响到正常的数据分析。所以对于采用Oracle10g版本的数据库用户,无论采用哪种方式统计信息时一定要慎重测试。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25148509/viewspace-715583/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-12-27

  • 博文量
    14
  • 访问量
    52179