Oracle建议启用自动优化器统计信息收集。在本例中,数据库自动收集具有缺失或陈旧统计信息的表的优化器统计信息。如果表需要新的统计信息,那么数据库将同时收集表和相关索引的统计信息。
自动收集消除了许多与管理优化器相关的手工任务。它还显著降低了由于缺少或陈旧的统计数据而生成糟糕执行计划的风险。
自动优化器统计信息收集调用DBMS_STATS。GATHER_DATABASE_STATS_JOB_PROC过程。这个内部过程的操作类似于DBMS_STATS。使用聚集自动选项的collec_database_stats过程。主要区别在于,collec_database_stats_job_proc优先处理需要统计信息的数据库对象,以便在维护窗口关闭之前首先处理最需要更新统计信息的对象
This section contains the following topics:
Enabling and Disabling Automatic Optimizer Statistics Collection
Considerations When Gathering Statistics
自动维护任务基础结构(称为AutoTask)安排任务在称为维护窗口的Oracle调度程序窗口中自动运行。默认情况下,一周中的每一天都有一个窗口。自动优化器统计信息收集作为AutoTask的一部分运行,默认情况下,在所有预定义的维护窗口中都启用自动优化器统计信息收集。
If for some reason automatic optimizer statistics collection is disabled, then you can enable it using the ENABLE
procedure in the DBMS_AUTO_TASK_ADMIN
package:
BEGIN DBMS_AUTO_TASK_ADMIN.ENABLE( client_name => 'auto optimizer stats collection' , operation => NULL , window_name => NULL ); END; /
When you want to disable automatic optimizer statistics collection, you can disable it using the DISABLE
procedure in the DBMS_AUTO_TASK_ADMIN
package:
BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE( client_name => 'auto optimizer stats collection' , operation => NULL , window_name => NULL ); END; /
自动优化器统计信息收集依赖于修改监视特性,在“确定陈旧统计信息”中进行了描述。如果禁用此功能,则自动优化器统计信息收集作业无法检测陈旧的统计信息。当将STATISTICS_LEVEL参数设置为TYPICAL或ALL时,将启用此功能。TYPICAL是默认值。
See Also:
Oracle Database Administrator's Guide for information about the AutoTask infrastructure
Oracle Database PL/SQL Packages and Types Reference for information about the DBMS_AUTO_TASK_ADMIN
package
This section discusses:
When to Use Manual Statistics
Restoring Previous Versions of Statistics
Locking Statistics
13.2.2.1 何时使用手动统计
对于以中等速度修改的大多数数据库对象,自动优化器统计信息收集应该足够了。然而,在某些情况下,收集可能不够。因为集合是在维护窗口期间运行的,所以对全天进行了显著修改的表的统计信息可能会变得陈旧。通常有两种类型的对象:
在一天中删除或截断并重新生成的易失性表。
对象是大容量负载的目标,这些负载会使对象的总大小增加10%或更多。
对于高度易失性的表,有两种方法:
这些表上的统计数据可以为空。当Oracle数据库遇到没有统计信息的表时,数据库动态地收集必要的统计信息作为查询优化的一部分。OPTIMIZER_DYNAMIC_SAMPLING参数控制这个动态统计特性。 Set this parameter to a value of 2
(default) or higher. You can set the statistics to null by deleting and then locking the statistics:
BEGIN DBMS_STATS.DELETE_TABLE_STATS('OE','ORDERS'); DBMS_STATS.LOCK_TABLE_STATS('OE','ORDERS'); END; /
See "Dynamic Statistics Levels" to learn how to set the levels for dynamic statistics.
可以将这些表的统计信息设置为表示表的典型状态的值。当表具有代表性的行数时,应该收集表上的统计信息,然后锁定统计信息。
这可能比自动优化器统计信息收集更有效,因为在夜间批处理窗口期间对表生成的任何统计信息可能都不是白天工作负载的最合适统计信息。
对于批量加载的表,在加载过程之后立即对表运行统计信息收集过程。最好将这些过程作为运行大容量负载的脚本或作业的一部分运行。
数据库可以通过以下方式收集外部表的统计数据:
GATHER_TABLE_STATS
procedure
GATHER_SCHEMA_STATS
procedure
GATHER_DATABASE_STATS
procedure
Automatic optimizer statistics collection processing
如果使用的是collec_table_stats,那么显式地将ESTIMATE_PERCENT选项设置为NULL、100或AUTO_SAMPLE,因为不支持对外部表进行抽样。由于数据库不允许对外部表进行数据操作,因此数据库从不将外部表上的统计信息标记为过期。例如,如果外部表需要新的统计信息,因为底层数据文件发生了更改,那么删除现有统计信息并重新整理它们。
如果通过将STATISTICS_LEVEL设置为BASIC禁用监视特性,那么自动优化器统计信息收集将无法检测到陈旧的统计信息。在这种情况下,您必须手动收集统计数据。有关自动监视功能的信息,请参阅“确定陈旧的统计信息”。
系统统计数据是另一种必须手动收集的统计数据。数据库不会自动收集这些统计数据。 See "System Statistics" for more information.
必须使用collec_fixed_objects_statsprocedure手动收集固定对象的统计信息,比如动态性能表。固定对象记录当前数据库活动。当数据库具有代表性活动时,应该收集统计信息。
13.2.2.2 Restoring Previous Versions of Statistics
每当修改dictionary中的统计信息时,都会自动保存旧版本的统计信息,以便将来进行恢复。可以使用DBMS_STATS包的还原过程还原统计信息。有关更多信息,请参见“恢复以前版本的统计数据”。
13.2.2.3 Locking Statistics
某些情况下,您可能希望防止DBMS_STATS_JOBprocess在表或模式上收集任何新的统计信息,例如“何时使用手动统计信息”中讨论的高度易失性表。在这些情况下,DBMS_STATS包提供了锁定表或模式统计信息的过程. See "Locking Statistics for a Table or Schema" for more information.