在SQL Server中创建索引的新功能。假设我有3列A, B, C
,其中没有一列是我的主键。我正在使用WHERE
子句创建许多查询,这些子句包含这些子句的任何和所有组合。因此,一些WHERE
条款可能只包括A,其他A和B,其他B和C,一些全部三个等等。
我应该为每种组合创建一个索引吗?
它们是否应将这些列包含为“包含的列”(如https://msdn.microsoft.com/en-us/library/ms190806.aspx中所述)
答案 0 :(得分:4)
您可以在(A, B, C)
上创建复合索引,但前提是您的查询始终使用该索引的 n最左侧列,即:
WHERE
子句A
和B
A
(A, B, C)
上的复合索引将 NOT 用于查询:
B
和C
B
C
如果您有类似的查询,那么是的,您可能需要分别在每个列上创建三个单独的索引。
但请记住:虽然索引可能会加快查询速度,但始终会导致INSERT
,UPDATE
和{{ 1}}(因为索引必须与表中的实际数据保持同步)。
所以更少的指数更好 - 不要过度指数!这通常比没有指数更糟糕......
答案 1 :(得分:2)
2)包含的列仅用于存储和返回数据,它们对过滤器的速度没有影响。但是,您可以使用它们来避免访问表本身(少一个索引搜索)。例如,如果选择列F,其中A,B被过滤,则可以创建索引((A,B)include(F)),它将与表(A,B)上的PRIMARY KEY一样快。但是,数据中的F数据将加倍。
1)这完全取决于你究竟在做什么,表中有多少行等等。通常,如果您总是选择多行,索引将无法帮助您 - 如果您选择1000行,它们将被忽略。原因是SQL Server在索引中搜索后需要分别搜索另一个(PRIMARY KEY)索引中的每一行,只是从上到下搜索整个表格更快。
如果SELECT返回一行或几行,则marc_s的答案适用。