繁体   English   中英

每次创建索引以便Oracle优化器使用它时,是否需要运行gather_table_stats?

[英]Do I need to run gather_table_stats every time I create an index in order for the Oracle optimizer to use it?

我看到了一些创建索引的例子。 之后执行以下操作:

exec dbms_stats.gather_table_stats(...)

这是否必须让Oracle关注索引? 我认为每天晚上收集统计数据(?)但是有些情况下我创建的索引对随后的解释计划感到失望。 也许我错过了一步?

这取决于Oracle的版本。

在9i之前的版本中,您必须在创建索引之后显式收集统计信息,然后基于成本的优化器才有可能使用它。

在9i中,Oracle将COMPUTE STATISTICS子句添加到CREATE INDEX语句中。 这使您可以在索引创建过程中收集有关索引的统计信息。 如果您未指定COMPUTE STATISTICS,则仍需在CBO可能考虑之前手动收集统计信息。

在10g中,默认行为已更改,Oracle会在您创建索引时自动计算索引的统计信息,而无需指定COMPUTE STATISTICS。 出于习惯的原因,或者因为他们只是更新旧的示例代码,人们通常会在他们发布的示例中包含GATHER_INDEX_STATS调用。

在10g及更高版本中,默认情况下会创建一个后台作业,用于收集缺少统计信息的对象和统计信息在夜间过时的对象的统计信息。 DCookie对10g工作的解释是现场。 Oracle改变了11g工作的设置方式,但它仍然基本上做同样的事情。

有一个名为GATHER_STATS_JOB的开箱即用的默认预定作业。 它在MAINTENANCE_WINDOW_GROUP中运行。 您的表可能会也可能不会被分析,具体取决于窗口中是否有足够的时间来访问它,或者窗口是否已被DBA更改等等。在这种情况下确保分析的最佳方法是手动创建索引后,为该表运行gather_table_stats作业。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM