我注意到在我的数据库中,我在表中有很多索引,这些索引只在包含的列中有所不同。
例如对于表A我有这个:
INDEX ON A(COLUMN_A) INCLUDE (COLUMN_B)
INDEX ON A(COLUMN_A) INCLUDE (COLUMN_C)
INDEX ON A(COLUMN_A) INCLUDE (COLUMN_D)
在我看来,只有这样才能更有效(插入/更新/删除):
INDEX ON A(COLUMN_A) INCLUDE (COLUMN_B, COLUMN_C, COLUMN_D)
有没有理由不这样做?
谢谢!
答案 0 :(得分:1)
你是对的,他们应该合二为一。 INCLUDE
- ed的非键列只存储在索引的叶节点中,因此可以读取它们。与键列不同,它们不构成索引层次结构的一部分,因此顺序并不重要。如果索引没有添加任何有用的东西,那么索引越少就越好,就像在这种情况下使用冗余索引一样。
另见
答案 1 :(得分:1)
最有可能的是,这是一种读取优化,而不是写入。如果有多个查询使用相同的键列(COLUMN_A
),但使用不同的"数据" column(COLUMN_B/C/D
),使用这种索引保存了一些I / O(不需要从表中加载不必要的数据,你已经将它与索引一起使用)。在一个索引中包含所有数据列将占用更少的空间(不需要将键列保存三个时间),但是在您的情况下每个索引都小于一个"组合"索引。
希望,基于性能分析和实际性能问题,索引是以这种方式创建的。这就是带有动机的文档非常方便的地方 - 为什么这样的索引是以这种方式创建的?它是不是很邋??对指数运作方式的了解不多?基于查询计划分析的自动优化?除非你知道这一点,否则调整这类事情可能是一个坏主意,特别是如果你实际上没有性能问题。