Oracle SQL表和索引统计信息

时间:2017-03-02 12:37:30

标签: oracle oracle11g

我一直在阅读有关收集Oracle数据库的表和索引统计信息的一些内容,但这让我感到困惑。

为了论证,我们假设Oracle 11gR2是RDBMS。关于收集表和索引统计信息,何时应该这样做,哪个是首选方法,Oracle是否真的自动为我们收集必要的统计信息?

关于第一点:何时应该完成。我已经读过,根据经验,自从上次表格修改(插入,更新等)约10%的表记录后,应该收集表和索引统计数据。分析了。

关于第二点:这是首选方式。如果我们想要计算表和索引统计信息,是否使用默认选项执行DBMS_STATS.GATHER_TABLE_STATS,假设表没有分区,是否足够?

关于第三点:Oracle是否真的为我们自动收集了必要的统计信息。如果是这种情况,我是否应该担心收集表统计数据(见第1点和第2点)?

提前致谢。

编辑:ammoQ的评论之后,我意识到这个问题并不清楚用例的真正含义。我的问题是关于那些没有的表格。 "操作"通过用户的动作,即手动,而不是通过通常由数据库作业运行的过程。以我的例子为例。我的ETL过程每天加载几个表,并在大约1小时内完成。在那1小时中,大约一半用于分析表格本身。因此,在插入或更新之后,每天分析表格区域。这似乎有点矫枉过正,因此这个问题。

1 个答案:

答案 0 :(得分:2)

通常,您需要具有代表性(不一定准确)的统计数据,并为您提供正确的执行计划。默认情况下,Oracle将在夜间批处理窗口期间运行统计信息收集作业。对于某些应用程序来说这可能没问题,但是如果你有一个数据仓库,可能包括一个常规的数据加载过程,那么管理统计数据应该是该过程的一部分。请注意,我说过“管理”而不是“收集”统计数据。这只是我的方式,除了收集统计数据之外,还有统计数据的其他选项,尽管收集统计数据将是我开始的地方。 还有一些事情可以用来优化统计数据收集,例如增量统计。 非常重要的另一件事是在收集统计数据时使用AUTO Sample大小。不要指定百分比,甚至不指定100%。原因是自动样本大小允许在不使用AUTO样本大小时禁用许多内部优化和功能。

所以,采取你的具体要点

  1. 10%的陈旧性是相当随机的,只是汽车统计数据使用的数字。
  2. dbms_stats.gather_table_stats(),默认值首选方法。我可以改变的一个参数是DEGREE,以便并行收集统计数据
  3. 在12c中,基本统计信息在加载到空表(或空分区)时收集。创建索引时,会根据索引构建统计信息。所以重申我上面所说的,统计数据收集应该是你的ELT过程的一部分。
  4. 我希望这是有道理和有帮助的。