首页 文章

Oracle SQL表和索引统计信息

提问于
浏览
1

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

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

关于第一点:何时应该完成 . 我已经读过,根据经验,收集表和索引统计信息应该在自上次分析表以来修改(插入,更新等)表的大约10%之后进行收集表和索引统计 .

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

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

提前致谢 .

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

1 回答

  • 2

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

    所以,采取你的具体要点

    • 10%陈旧度非常随机,只是汽车统计数据使用的数字 .
      具有默认值的

    • dbms_stats.gather_table_stats()是首选方法 . 我可以改变的一个参数是DEGREE,以便并行收集统计数据

    • 在12c中,基本统计数据在加载到空表(或空分区)时收集 . 创建索引时,会根据索引构建统计信息 . 所以重申我上面所说的,统计数据收集应该是你的ELT过程的一部分 .

    我希望这是有道理和有帮助的 .

相关问题