具有多个相同列索引的Oracle性能

时间:2009-06-19 20:37:04

标签: performance indexing oracle9i

我正在使用新的Oracle DB,其中一个表具有以下索引:

  • 索引1:ColA,ColB
  • 索引2:ColA

第二个索引是多余的,这会对性能产生负面影响吗?

4 个答案:

答案 0 :(得分:5)

Google是我最好的朋友:

http://www.orafaq.com/node/926

本文的要点是:

If 2 indexes ( I1 and I2 ) exist for a table and
   the number of columns in Index I1 is less or equal to the number of column in index I2 and
   index I1 has the same columns in the same order as leading columns of index I2 
Then
   If index I1 is UNIQUE then
      If index I2 is used to support Foregh Key or for Index Overload then
         Do Nothing
      Else
         Index I2 can be DROPPED
      End If
   Else
      Index I1 can be DROPPED
   End If
End If

我同意这一点! 实际上,在Google中搜索“重复索引”会有不同类型的答案。

答案 1 :(得分:2)

第二个索引不同,本身并不冗余。

这个查询怎么样:

SELECT DISTINCT ColA FROM TABLE WHERE ColA IS NOT NULL;

Oracle完全可以从索引2回答这个问题。现在,索引2预计会比索引1小(减少块)。这意味着,它是上述查询的更好索引。

如果您的应用程序从未执行过比Index2更适合Index2的查询,那么它对您的应用程序来说是多余的。

索引始终是性能权衡。当执行插入,更新或删除时,还需要做额外的工作来维护每个附加索引。

索引提供的性能提升可以弥补这一点吗?取决于您的应用程序和数据使用情况。

答案 2 :(得分:1)

第二个索引是多余的 - 使用Index2的任何操作都可以使用索引1.此外,由于还有另一个要更新的索引,因此写入速度会稍慢。

也就是说,Index2并不完全是多余的,因为索引本身可能要小得多,因为它可能会更快一点。

答案 3 :(得分:1)

如果您的统计信息过期,优化程序可能会在需要索引1时选择索引2。 (当然,提示优化器会解决这个问题。)