【发布时间】:2013-06-17 14:07:38
【问题描述】:
http://www.sqlservercentral.com/articles/Stairway+Series/72284/
我正在阅读这篇 sqlservercentral 文章,他们正在使用它进行查询。
SELECT *
FROM Person.Contact
WHERE FirstName = 'Helen'
AND LastName = 'Meyer';
GO
为了使上述搜索更快,他们创建了以下索引。
CREATE NONCLUSTERED INDEX FullName
ON Person.Contact
( LastName, FirstName );
GO
我无法弄清楚在 where 子句中我们先名后姓。 并且在索引中它的顺序相反(姓氏,名字)
当我们创建复合索引时,它在这里有何不同。 我知道 lastname 会先排序,然后 firstname 会排序。
我通过两种方式(姓氏,名字)创建索引来检查统计信息 和(名,姓)。
(lastname, firstname) 方式稍微快一些,我想知道为什么where子句顺序和索引列顺序相反?
【问题讨论】:
-
以防万一,索引的顺序无关紧要。当两者都指定时,您拥有的用于搜索 (
LastName, FirstName) 的索引,它同样适用于仅指定的搜索LastName。但是:如果您只搜索FirstName,它不会有帮助。要使复合索引起作用,您必须在WHERE子句中指定索引的最左侧列(此处:最左侧 1 或 2 个)。 -
@marc_s 如果我在 5 列
Comp_IX (col1,col2,col3,col4,col5)上创建复合索引,那么我可以指定所有 5 列或只指定最左边的col1,这样它就会进行索引搜索,对吧? -
@VishwanathDalvi:如果你有这样的索引,你可以搜索
col1,或者col1和col2,或者col1和col2和col3- 等等向前。但是您不能仅搜索col3,或col2和col5- n 最左侧的列(如索引定义中所述)必须包含在您的 WHERE 子句中 - 否则索引无用
标签: sql sql-server indexing