显然,保留几个不同的索引会对插入和删除性能产生负面影响。查询性能如何:在一个表上保留太多索引完全有意义吗?在任何情况下添加索引都会提高查询性能(当然,对于使用索引的查询而言)还是会因为索引过多而降低查询性能,因为有必要查询所有索引以获取索引。结果?
如果表上有不同的索引:是否会全部考虑这些索引,或者从优化程序的角度来看仅是最佳索引?Oracle是否实现多维索引?
显然,保留几个不同的索引会对插入和删除性能产生负面影响。查询性能如何:在一个表上保留太多索引完全有意义吗?在任何情况下添加索引都会提高查询性能(当然,对于使用索引的查询而言)还是会因为索引过多而降低查询性能,因为有必要查询所有索引以获取索引。结果?
如果表上有不同的索引:是否会全部考虑这些索引,或者从优化程序的角度来看仅是最佳索引?Oracle是否实现多维索引?
Answers:
当有更多要考虑的指标时,生成计划的时间会稍长一些,但我怀疑这种差异是否会显着。删除索引的原因未列出查询性能。另一方面,通常,除非您知道将使用索引来提高查询效率,否则不应该创建索引。
《Oracle概念指南》提供了创建索引的标准。
通常,在以下任何情况下,请考虑在列上创建索引:
经常查询索引的列,并返回表中总行数的一小部分。
一个或多个索引列上存在引用完整性约束。索引是避免完全表锁定的一种方法,如果您更新了父表的主键,合并到父表中或从父表中删除,则可能会需要该索引。
唯一键约束将放置在表上,并且您要手动指定索引和所有索引选项。
从检查查询表中的所有索引以确定是否可以使用它们的意义上考虑所有索引。那些可能被进一步检查以确定其有用性。
我在《应用程序开发人员指南》的“ 选择索引策略”中找到了这一点。该页面关于“选择索引策略”:
限制每个表的索引数
索引越多,更改表的开销就越大。插入或删除行时,必须更新表上的所有索引。更新列时,必须更新列上的所有索引。
您必须权衡查询索引的性能优势与更新的性能开销。例如,如果一个表主要是只读的,则可以使用更多的索引。但是,如果一个表被大量更新,则可以使用更少的索引。