包含列的索引

时间:2014-03-21 13:19:45

标签: sql-server

我注意到在我的数据库中,我在表中有很多索引,这些索引只在包含的列中有所不同。

例如对于表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)

有没有理由不这样做?

谢谢!

2 个答案:

答案 0 :(得分:1)

你是对的,他们应该合二为一。 INCLUDE - ed的非键列只存储在索引的叶节点中,因此可以读取它们。与键列不同,它们不构成索引层次结构的一部分,因此顺序并不重要。如果索引没有添加任何有用的东西,那么索引越少就越好,就像在这种情况下使用冗余索引一样。

另见

https://stackoverflow.com/a/1308012/8479

http://msdn.microsoft.com/en-us/library/ms190806.aspx

答案 1 :(得分:1)

最有可能的是,这是一种读取优化,而不是写入。如果有多个查询使用相同的键列(COLUMN_A),但使用不同的"数据" column(COLUMN_B/C/D),使用这种索引保存了一些I / O(不需要从表中加载不必要的数据,你已经将它与索引一起使用)。在一个索引中包含所有数据列将占用更少的空间(不需要将键列保存三个时间),但是在您的情况下每个索引都小于一个"组合"索引。

希望,基于性能分析和实际性能问题,索引是以这种方式创建的。这就是带有动机的文档非常方便的地方 - 为什么这样的索引是以这种方式创建的?它是不是很邋??对指数运作方式的了解不多?基于查询计划分析的自动优化?除非你知道这一点,否则调整这类事情可能是一个坏主意,特别是如果你实际上没有性能问题。