【问题标题】:Changing the column order in composite index?更改复合索引中的列顺序?
【发布时间】: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,或者col1col2,或者col1col2col3 - 等等向前。但是您不能仅搜索 col3,或 col2col5 - n 最左侧的列(如索引定义中所述)必须包含在您的 WHERE 子句中 - 否则索引无用

标签: sql sql-server indexing


【解决方案1】:

SQL Server(和大多数 RDBMS)将忽略 WHERE 条件的顺序。

发生这种情况是因为 SQL 是一种声明性语言:你说你想要什么,而不是如何去做。所以查询优化器会重新排列 WHERE 条件以匹配合适的索引。

请注意,您将在查询计划中对聚集索引进行键查找,以获取由于未覆盖而不在索引中的其余列。

【讨论】:

猜你喜欢
  • 2017-03-12
  • 2019-02-01
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 2017-12-30
  • 2019-06-22
  • 1970-01-01
相关资源
最近更新 更多