Sql server 包含列的索引
我注意到在我的数据库中,我在一个表中有很多索引,它们只在包含的列中有所不同 例如,对于表A,我有:Sql server 包含列的索引,sql-server,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) 在我看来,只有这样做(对于插入/更新
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)
在我看来,只有这样做(对于插入/更新/删除)会更有效率:
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)
有什么理由不这样做吗
谢谢 你说得对,它们应该合并成一个。包含的非键列只存储在索引的叶节点中,以便读取。与键列不同,它们不构成索引层次结构的一部分,因此顺序并不重要。如果索引没有添加任何有用的内容,那么拥有更少的索引是一件好事,就像在本例中使用冗余索引一样 另见
这很可能是一种读优化,而不是写优化。如果有多个查询使用相同的键列(
column\u A
),但使用不同的“data”列(column\u B/C/D
),则使用这种索引可以节省一些I/O(无需从表中加载不必要的数据,您已经将其与索引一起拥有)。将所有数据列包含在一个索引中会占用更少的空间(无需将关键列保存三次),但在您的情况下,每个索引都比一个“组合”索引小
希望基于性能分析和实际性能问题,以这种方式创建索引是有原因的。这就是有动机的文档非常方便的地方——为什么索引是这样创建的?是马虎吗?对索引的工作方式知之甚少?基于查询计划分析的自动优化?除非您知道这一点,否则调整这种东西可能是个坏主意,特别是如果您实际上没有性能问题的话