在SQL中正确使用多个索引(SQL Server 2014)

时间:2016-02-18 14:30:52

标签: sql sql-server

在SQL Server中创建索引的新功能。假设我有3列A, B, C,其中没有一列是我的主键。我正在使用WHERE子句创建许多查询,这些子句包含这些子句的任何和所有组合。因此,一些WHERE条款可能只包括A,其他A和B,其他B和C,一些全部三个等等。

  1. 我应该为每种组合创建一个索引吗?

  2. 它们是否应将这些列包含为“包含的列”(如https://msdn.microsoft.com/en-us/library/ms190806.aspx中所述)

2 个答案:

答案 0 :(得分:4)

您可以在(A, B, C)上创建复合索引,但前提是您的查询始终使用该索引的 n最左侧列,即:

  • 您始终使用WHERE子句
  • 中的所有三列进行查询
  • 或您使用AB
  • 或您只使用A

(A, B, C)上的复合索引将 NOT 用于查询:

  • 使用BC
  • B
  • C

如果您有类似的查询,那么是的,您可能需要分别在每个列上创建三个单独的索引。

但请记住:虽然索引可能会加快查询速度,但始终会导致INSERTUPDATE和{{ 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的答案适用。