Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 包含列的索引_Sql Server - Fatal编程技术网

Sql server 包含列的索引

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) 在我看来,只有这样做(对于插入/更新

我注意到在我的数据库中,我在一个表中有很多索引,它们只在包含的列中有所不同

例如,对于表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)
有什么理由不这样做吗


谢谢

你说得对,它们应该合并成一个。包含的非键列只存储在索引的叶节点中,以便读取。与键列不同,它们不构成索引层次结构的一部分,因此顺序并不重要。如果索引没有添加任何有用的内容,那么拥有更少的索引是一件好事,就像在本例中使用冗余索引一样

另见


这很可能是一种读优化,而不是写优化。如果有多个查询使用相同的键列(
column\u A
),但使用不同的“data”列(
column\u B/C/D
),则使用这种索引可以节省一些I/O(无需从表中加载不必要的数据,您已经将其与索引一起拥有)。将所有数据列包含在一个索引中会占用更少的空间(无需将关键列保存三次),但在您的情况下,每个索引都比一个“组合”索引小

希望基于性能分析和实际性能问题,以这种方式创建索引是有原因的。这就是有动机的文档非常方便的地方——为什么索引是这样创建的?是马虎吗?对索引的工作方式知之甚少?基于查询计划分析的自动优化?除非您知道这一点,否则调整这种东西可能是个坏主意,特别是如果您实际上没有性能问题的话