4列复合索引对3列查询有利吗?

时间:2018-09-10 16:46:28

标签: sql sql-server database indexing

我有一个包含列A, B, C, D, E, ..., N的表。与PK(A)。我还为该列DCBA依次定义了一个复合,唯一,非聚集索引。

如果我使用类似这样的查询:

where D = 'a' and C = 'b' and B = 'c'

在没有A子句的情况下,我仍然可以获得索引的好处吗?

3 个答案:

答案 0 :(得分:2)

是的,它仍然会正确使用索引,并使查询效率更高。

将其想象为课本中的嵌套目录:

  • 略过,直到看到章节名称(例如“数据结构”)
    • 跳过,直到看到相关的部分标题(“二叉树”)
      • 略过,直到看到相关主题(例如“堆”)。

如果您只想进入二叉树部分,那么进入主题级别的内容完全不会伤害您:)。

现在...如果您想查找二叉树而又不知道它们是数据结构,那么此目录对您将不是很有用(例如,如果您缺少“ D”)。

答案 1 :(得分:2)

是的,对于这些查询,SQL Server可以在索引(D, C, B, A)上执行查找操作:

WHERE D = 'd'
WHERE D = 'd' AND C = 'c'
WHERE D = 'd' AND C = 'c' AND B = 'b'
WHERE D = 'd' AND C = 'c' AND B = 'b' AND A = 'a'

它可以对上述索引执行扫描操作:

WHERE C = 'c' AND B = 'b'
WHERE A = 'a'
-- etc

但是还有一件事要考虑:索引中列的顺序很重要。可能有两个索引(D, C, B, A)(B, C, D, A)表现不同。考虑以下示例:

WHERE Active = 1 AND Type = 2 AND Date = '2019-09-10'

假设数据包含两个不同的Active值,则Type为10,Date为1000,(Date, Type, Active, Other)上的索引将比(Active, Type, Date, Other)更有效率。

您还可以考虑为不同的查询创建所述索引的不同变体。

PS:如果未在WHERE子句中使用列A,则只需INCLUDE

答案 2 :(得分:1)

是的,现在SQL可以只查找那些记录,而不必扫描整个表。

此外:

  1. SQL将有更好的统计信息(SQL将在组成索引的一组列上自动创建统计信息)关于多少行可能满足您的查询
  2. 它是UNIQUE的事实还将告诉SQL有关数据的信息,这可能会导致更好的计划(例如,如果您使用DISTINCT或UNION,它将知道这些列已经是不同的)。
  3. SQL将必须读取较少的数据,因为它不必读取所有“ N”列(即使您只需要3个),它也可以读取索引,索引将具有4个,因此只有一个是“多余的” 。

请注意,由于特定的查询在D,C和B上是WHERE,因此在这种情况下,索引的顺序将无关紧要。如果WHERE子句仅在C和B上,您将获得的收益要少得多,因为SQL将不再能够在D上进行搜索,并且上面的(1)和(2)都不适用。 (3)仍然会。