当WHERE子句中只有一列时,SQL Server是否会使用复合索引?

时间:2010-02-09 10:06:26

标签: sql-server performance compound-index

说我有一张桌子:

CREATE TABLE Users (
    Id INT IDENTITY (1, 1),
    FirstName VARCHAR(40),
    LastName VARCHAR(40)
)

查询通常位于 FirstName LastName 上,但也位于 FirstName LastName

如果我在 FirstName 上创建非聚集索引而在 LastName 上创建另一个索引,那么我的前两个查询将被提供。显然,SQL Server将使用index intersection进行其他查询。

或者,如果我在(FirstName)和on(LastName,FirstName)上有索引,那么SQL Server是否可以使用第二个索引来查询 LastName 以及两者上的查询?< / p>

SQL Server是否将复合索引部分从左到右或从右到左存储?换句话说:它会将密钥构建为LastNameFirstName还是FirstNameLastName?或者可以随意选择一个吗?

3 个答案:

答案 0 :(得分:5)

  

SQL Server是否可以使用索引(LastName,FirstName)来查询LastName以及两者上的查询?

是的,数据库将使用索引(LastName,FirstName)对LastName进行查询。它将仅在FirstName上使用此索引进行查询。

  

它是否从左到右或从右到左存储复合索引部分?

存储位于B-Tree。无论您将其视为从右到左还是从左到右存储,都只是一种有用的可视化辅助工具,与实际数据存储无关。

答案 1 :(得分:1)

是的,如果仅查询LastName,则应使用(LastName,FirstName)索引。所以当单独使用LastName或者同时查询LastName和FirstName时,它都会被使用。

一般准则是确保具有最大选择性的列首先出现在复合索引中,因为这样可以在下面的选择性较低的列之前提供最大的好处/缩小结果集。

答案 2 :(得分:1)

根据您发送的实际查询,即使您仅搜索第二列,也可能会使用两列上的复合索引。但是,您不会获得索引搜索,但很可能是索引扫描。如果这对您来说“足够好”,取决于您的具体环境。索引更像是一门艺术,而不是一门科学,许多不同的因素会影响您决定如何索引表格。这总是一种权衡,因为在桌子上有太多的索引和太少的索引一样糟糕。确保最关键的查询得到很好的覆盖,然后根据具体情况决定是否有任何额外的索引值得花费。

此外,由于尚未提及并且至少在SQL Server 2005上提供了这一点:让我为非聚集索引引入INCLUDE子句。它是任何索引策略的一个被忽视但非常有用的补充。