在你的经验、如何经常应Oracle数据库的统计数据以运行?我们的团队开发人员最近发现,统计数据没有运行我们的生产框2的1/2个月。这听起来像一个很长的时间到我,但我不是一个DBA。

有帮助吗?

解决方案

在我最后工作,我们跑的统计数据,每周一次。如果我没有记错的话,我们预计他们在一星期四晚上和星期五上的数据库管理员都非常小心监视的最长运行查询的任何意外。(星期五被选中是因为它往往只是后一个代码发布和往往是相当低的流量日。) 当他们看到了一个不好的查询,他们会找到一个更好的查询计划和保存的那一个,所以它不会改变再次意外。(Oracle有工具来为你做这个自动的,你告诉它的查询,以优化和它的作用。)

许多组织避免在运行的统计数据的恐惧不良的查询计划出现了意外。但是,这通常意味着他们的询问计划变得更糟和更糟糕的是随着时间的推移。并且当他们运行的统计数据然后他们会遇到一些问题。在得到争夺来解决这些问题证实了他们的恐惧有关的危险的运行统计。但是,如果他们跑了统计数据,使用的监测工具,因为它们都应该和固定的问题,因为他们想出了然后他们就会有较少的头痛,他们就不会遇到他们所有的一次。

其他提示

由于Oracle11g统计数据自动收集的默认。

两个调度窗预定的安装后的Oracle数据库:

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

窗户群体?

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行,这不是一个非常显着的变化。当一个表,从1000行的所有具有相同的价值观中通常查询列X到1000行与几乎是独一无二的价值在列X,这是一个显着的变化。

统计数字存储的信息有关的项目计数和相对频率--的东西会让它"猜猜"在行将符合一定的标准。当猜测是错误的,优化可以选择一个 非常 最理想的查询计划。

甲骨文的版本都是你使用?检查这个网页,其中指Oracle10:

http://www.acs.ilstu.edu/docs/Oracle/server.101/b10752/stats.htm

它说:

建议的方法来收集统计数据是允许Oracle自动收集的统计数据。Oracle收集统计数据上的所有数据库对象的自动和维持这些统计数据在一定期的维护工作。

当我还是管理一个大型多用户规划系统的支持Oracle,我们DBA有一个每周一次的工作,收集统计数据。此外,当我们推出了一个显着的变化,可能影响或可能被影响的统计数据,我们将力的工作运行周期得到的东西被抓住了。

与10g和更高的版本oracle,最新的统计数字表和索引需要通过优化使"良好的"执行计划的决定。你如何经常收集的统计数据是一个棘手的呼吁。这取决于你的应用程序、模式、数据率和业务实践。某些第三方应用其编写是向后兼容的旧版本的oracle不执行以及与新的优化。这些应用程序的需要,表中都没有统计数据,以便该数据库度假回来统治基执行计划。但在平均oracle建议统计数据收集的表陈旧的统计数据。你可以设定表,以监测和检查他们的国家和它们的分析如果时陈旧。通常这是不够的,有时候它不是。这真的取决于你的数据库。我的数据库,我们有一套表格的只读那些需要夜间统计数据的收集,以保持效能。其他表格分析,每周一次。在我们的大dw数据库,我们分析需要作表太大的经常分析,而不会影响总体db负载和性能。所以,正确的答案是,它取决于应用程序、数据的变化和业务需要。

确保以平衡的风险,新鲜的统计数字造成不希望的变化查询计划针对的风险,陈旧的统计数字本身可以导致查询计划,以改变。

想象一下,你有一个错误数据库表的问题,并列CREATE_DATE值中所列的增加或多或少单调现在,假设有一个直方图在此列,告诉Oracle,值此列之间均匀分布1月、2008年和九月17日,2008年。这使得它能够为优化的合理估计数的排,这将是返回的,如果你是在寻找创建的所有问题的最后一个星期(即九月7-13条)。如果申请继续被用和统计数据从来没有更新,不过,这直方图将越来越少准确的。所以优化将预期查询"的问题创造最后一个星期"是不准确的时间并且可能最终导致Oracle改变的查询计划产生负面影响。

在这种情况下的一个数据仓库中型系统可以考虑收集没有统计数据,并依靠动态的取样(设置optimizer_dynamic_sampling2级或以上)。

通常不建议收集统计数据,因此经常在整个数据库,除非你有一个强有力的理由,诸如批量插入或大数据的变化频繁发生在数据库。收集统计数据库在这个频率可能改变的查询执行计划到一个新的贫穷执行计划,事情可能会花费你很多时间试图为你每个查询受影响的新的贫穷的计划,这就是为什么你应该试验的影响,收集新的统计数据测试数据库,或者如果你没有时间和人力,至少你应该保持一个后备计划通过备份原始静之前收集新的, 所以,如果你收集新的统计信息,然后查询并没有执行,因为预计,你可以很容易地恢复的原始统计数据。

有一个非常有用的剧本可以帮助你备份的原始统计数据和收集新的和提供SQL命令可用于恢复原静的情况下的事情没有如预期在收集新的统计数据。你可以找到脚本在此链接:http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistics-on.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top