Oracle Statistic统计信息概念简介

统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息。
比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息。
CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划。
STATISTICS_LEVEL初始化参数可控制对各种统计信息和各种指导的捕获,其中包括自动维护任务。自动维护任务包括搜集优化程序统计信息。
STATISTICS_LEVEL参数可设置为以下级别:
• BASIC:AWR 统计信息和度量的计算被关闭。自动优化程序统计信息任务被禁用,所有指导和服务器生成的预警也被禁用。只收集基本的统计信息;
• TYPICAL:收集数据库自我管理所需的主要统计信息。这些统计信息表示监视OracleDB 行为通常需要的信息。这包括自动搜集统计信息,以减少由于统计信息过时或无效而导致不正确执行SQL 语句的可能性。收集大部分统计信息(数据库的默认设置);
• ALL:捕获所有可能的统计信息。此捕获级别增加了计时操作系统统计信息和计划执行统计信息。多数情况下并不需要这些统计信息,为了获得最佳性能,不应启用这些统计信息;有时执行特定的诊断测试时需要这些统计信息。
Oracle 建议将STATISTICS_LEVEL初始化参数设置为默认值TYPICAL。如果将该参数的值设置为BASIC,则会禁用自动搜集优化程序统计信息功能。

统计信息的分类
Oracle 的Statistic 信息的收集分两种:自动收集和手工收集。
Oracle 的Automatic Statistics Gathering 是通过Scheduler 来实现收集和维护的。
Job 名称是GATHER_STATS_JOB, 该Job收集数据库所有对象的2种统计信息:
(1)Missing statistics(统计信息缺失)
(2)Stale statistics(统计信息陈旧)
该Job 是在数据库创建的时候自动创建,并由Scheduler来管理。Scheduler 在maintenance windows open时运行gather job。
默认情况下,job 会在每天晚上10到早上6点和周末全天开启。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。
Scheduler Job的stop_on_window_close 属性控制GATHER_STATS_JOB 是否继续。该属性默认值为True. 如果该值设置为False,那么GATHER_STATS_JOB 会中断, 而没有收集完的对象将在下次启动时继续收集。
Gather_stats_job 调用dbms_stats.gather_database_stats_job_proc过程来收集statistics 的信息。 该过程收集对象statistics的条件如下:
(1)对象的统计信息之前没有收集过。
(2)当对象有超过10%的rows 被修改,此时对象的统计信息也称为stale statistics。
但是对于高度变化的表在白天的活动期间被TRUNCATE/DROP并重建或者块加载超过本身总大小10%的对象;我们可以将这些表上的统计设置为NULL;
可以通过以下SQL来查看:
select job_name, program_name, enabled, stop_on_window_close
from dba_scheduler_jobs where job_name = 'gather_stats_job';

通过设置初始化参数STATISTIC_LEVEL 为TYPICAL 或ALL,就可以自动收集统计信息。参数的值可以激活GATHER_STATS_JOB。basic则无法自动收集任何信息;
如果设置为basic,不仅不能监控表,而且将禁掉如下一些10g的新功能:
(1)ASH(Active Session History)
(2)ASSM(Automatic Shared Memory Management)
(3)AWR(Automatic Workload Repository)
(4)ADDM(Automatic Database Diagnostic Monitor)

统计信息的内容:
1)Table statistics
Number of rows --行数量、Number of blocks --block数量、Average row length --平均行的长度.
2)Column statistics
Number of distinct values (NDV) in column --列中distinct的值
Number of nulls in column --列中null的值、Data distribution (histogram) --数据分布
3)Index statistics
Number of leaf blocks --子节点的块数量、Levels --子节点数量、Clustering factor --集群因子
4)System statistics
I/O performance and utilization --IO性能和利用率、CPU performance and utilization

Oracle Statistic 的收集,可以使用analyze 命令,也可以使用DBMS_STATS 包来收集;
Oracle 建议使用DBMS_STATS包来收集统计信息,因为DBMS_STATS包收集的更广,并且更准确。analyze 在以后的版本中可能会被移除。

DBMS_STATS常用的几个过程如下:
dbms_stats.gather_table_stats 收集表、列和索引的统计信息;
dbms_stats.gather_schema_stats 收集SCHEMA下所有对象的统计信息;
dbms_stats.gather_index_stats 收集索引的统计信息;
dbms_stats.gather_system_stats 收集系统统计信息
DBMS_STATS.GATHER_DICTIONARY_STATS:所有字典对象的统计;
DBMS_STATS.GATHER_DICTIONARY_STATS 其收集所有系统模式的统计
dbms_stats.delete_table_stats 删除表的统计信息
dbms_stats.delete_index_stats 删除索引的统计信息
dbms_stats.export_table_stats 输出表的统计信息
dbms_stats.create_state_table
dbms_stats.set_table_stats 设置表的统计
dbms_stats.auto_sample_size

analyze 命令的语法如下:
SQL>analyze table tablename compute statistics;
SQL>analyze table tablename compute statistics for all indexes;
SQL>analyze table tablename delete statistics

可以从统计信息的历史信息恢复统计信息。
This procedure restores statistics of a table as of a specified timestamp (as_of_timestamp). The procedure will restore statistics of associated indexes and columns as well. If the table statistics were locked at the specified timestamp the procedure will lock the statistics. The procedure will not restore user defined statistics.

验证统计信息:
PENDING功能就是防患于未然;dba收集了新的统计信息但是在确定新的统计信息比现在使用的统计信息更好之前不想让数据库自动使用,而由dba经过性能测试以后再发布到系统里让数据库使用新的统计信息;
例如:DBMS_STATS.SET_TABLE_PREFS('SH', 'CUSTOMERS', 'PUBLISH', 'false');
Subsequently, statistics gathered on the CUSTOMERS table are stored as pending statistics

posted @ 2026-06-26 19:17  秋之枫叶  阅读(4)  评论(0)    收藏  举报