现在的位置: 首页 > 综合 > 正文

Oracle统计信息

2012年06月25日 综合 ⁄ 共 2928字 ⁄ 字号 暂无评论
博客主机

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

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;
------------------------------------------------------------------------------------

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

给我留言

留言无头像?