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

标签 sql oracle indexing

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

exec dbms_stats.gather_table_stats(...)

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

最佳答案

这取决于 Oracle 的版本。

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

在 9i 中,Oracle 在 CREATE INDEX 语句中添加了 COMPUTE STATISTICS 子句。这允许您在索引创建过程中收集有关索引的统计信息。如果您没有指定 COMPUTE STATISTICS,您仍然必须在 CBO 考虑之前手动收集统计信息。

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

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

关于sql - 每次创建索引时是否都需要运行 gather_table_stats 以便 Oracle 优化器使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4159063/

相关文章:

mysql - 为什么 MySQL 选择看似效率较低的索引?

sql - SQL查询麻烦SQLite

sql - 检索 "Create Table As"语句中使用的脚本

甲骨文 : how to ensure that a function in the where clause will be called only after all the remaining where clauses have filtered the result?

java - SQL查询语句从oracle数据库中检索具有CLOB数据的记录

python - 当行元素满足条件 Pandas 时查找列名

mysql - MAX(Date) 给出空结果

mysql - 返回零行,尽管 SQL 查询

sql - 将多行的值汇总到一个新列中

sql - 为什么允许我有两个同名索引?