我有一个包含列A, B, C, D, E, ..., N
的表。与PK(A)
。我还为该列D
,C
,B
,A
依次定义了一个复合,唯一,非聚集索引。
如果我使用类似这样的查询:
where D = 'a' and C = 'b' and B = 'c'
在没有A子句的情况下,我仍然可以获得索引的好处吗?
答案 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可以只查找那些记录,而不必扫描整个表。
此外:
请注意,由于特定的查询在D,C和B上是WHERE,因此在这种情况下,索引的顺序将无关紧要。如果WHERE子句仅在C和B上,您将获得的收益要少得多,因为SQL将不再能够在D上进行搜索,并且上面的(1)和(2)都不适用。 (3)仍然会。