根据您的经验,Oracle数据库统计信息应该多久运行一次?我们的开发团队最近发现,统计数据尚未在我们的生产箱中运行超过2个半月.这对我来说听起来很长,但我不是DBA.
由于默认情况下会自动收集Oracle 11g统计信息.
安装Oracle数据库时预定义了两个Scheduler窗口:
WEEKNIGHT_WINDOW从晚上10点开始,每周一到周五早上6点结束.
WEEKEND_WINDOW涵盖周六和周日的整天.
上次收集统计数据时?
SELECT owner, table_name, last_analyzed FROM all_tables ORDER BY last_analyzed DESC NULLS LAST; --Tables. SELECT owner, index_name, last_analyzed FROM all_indexes ORDER BY last_analyzed DESC NULLS LAST; -- Indexes.
自动统计数据收集的状态?
SELECT * FROM dba_autotask_client WHERE client_name = 'auto optimizer stats collection';
Windows群组?
SELECT window_group_name, window_name FROM dba_scheduler_wingroup_members;
窗口时间表?
SELECT window_name, start_time, duration FROM dba_autotask_schedule;
在此架构中手动收集数据库统计信息:
EXEC dbms_stats.gather_schema_stats(ownname=>NULL, cascade=>TRUE); -- cascade=>TRUE means include Table Indexes too.
在所有架构中手动收集数据库统计信息!
-- Probably need to CONNECT / AS SYSDBA EXEC dbms_stats.gather_database_stats;
每当数据"显着"变化时.
如果一个表从1行到200行,那是一个重大变化.当一个表从100,000行到150,000行时,这不是一个非常重要的变化.当一个表从常见查询列X中的所有具有相同值的1000行到X列中具有几乎唯一值的1000行时,这是一个重大变化.
统计信息存储有关项目计数和相对频率的信息 - 这些信息可以让它"猜测"符合给定条件的行数.当它猜错时,优化器可以选择一个非常不理想的查询计划.
在我上一份工作中,我们每周进行一次统计.如果我没记错的话,我们会在星期四晚上安排它们,并且在星期五,DBA非常小心地监视运行时间最长的查询以查找任何意外情况.(星期五被选中是因为它通常只是在代码发布之后,并且往往是一个相当低的流量日.)当他们看到一个错误的查询时,他们会找到一个更好的查询计划并保存它,以便它不会再次意外地改变.(Oracle有自动为您执行此操作的工具,您告诉它要优化的查询,它确实如此.)
许多组织因为担心错误地突然出现查询计划而避免运行统计信息.但这通常意味着他们的查询计划随着时间的推移变得越来越糟.当他们运行统计数据时,他们会遇到许多问题.由此产生的纠正这些问题的争论证实了他们对运行统计数据的危险性的担忧.但是,如果他们定期运行统计数据,按照预期使用监控工具,并在问题出现时修复问题,那么他们就会有更少的麻烦,并且他们不会立即遇到这些问题.
您使用的是什么Oracle版本?查看此页面引用Oracle 10:
http://www.acs.ilstu.edu/docs/Oracle/server.101/b10752/stats.htm
它说:
收集统计信息的建议方法是允许Oracle自动收集统计信息.Oracle自动收集有关所有数据库对象的统计信息,并在定期计划的维护作业中维护这些统计信息.