Oracle 11G - 索引重建 VS GATHER_TABLE_STATS

5 oracle plsql

快速提问,在填充我的表后,我通过我的解释计划注意到索引,在大多数情况下,似乎只有在我执行后才生效GATHER_TABLE_STATS

Exec DBMS_STATS.GATHER_TABLE_STATS(ownname => 'USER/SCHEMA', tabname => 'MYTABLE', cascade=> true, degree=> 8);
Run Code Online (Sandbox Code Playgroud)

CASCADE ”属性定义为:收集有关此表索引的统计信息。索引统计信息收集不是并行化的。使用此选项等效于GATHER_INDEX_STATS在每个表的索引上运行过程。

所以我的问题是,我应该REBUILD在 之前运行我的索引吗GATHER_TABLE_STATS,因为我假设收集索引统计信息并重建它们不是一回事,或者是吗?

目前,我运行dbms_index_utl.build_table_indexes重建我的索引,然后是GATHER_TABLE_STATS,我只是不知道是否有必要,请注意,我的解释计划似乎表明它是,否则,除非我向查询添加提示,否则索引将不会'习惯了。

Jus*_*ave 7

收集统计信息和重建索引是两件完全不同的事情。

  • Oracle 中的索引需要重建的情况极为罕见,因此任何定期重建索引的进程都非常可疑。我强烈怀疑重建索引是不必要的。我强烈建议花一些时间阅读 Richard Foote 的Index Internals - Rebuilding the Truth以了解为什么很少需要重建索引以及在哪些情况下需要重建索引。
  • 当数据量或分布发生实质性变化时,您确实需要收集有关表和索引的统计信息,以便为优化器提供确定适当查询计划所需的信息。如果您在一个空表上创建一个索引,然后将数百万行插入到该表中,您将需要收集统计信息以告诉优化器该表不再是 1 个空范围。除非您禁用自动作业,否则 Oracle 还将自动收集自上次在每天凌晨收集统计信息以来发生重大变化的任何对象的统计信息。