10

假设我有一张桌子:

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

查询通常在FirstNameLastName上,但也在FirstName LastName上。

如果我在FirstName上创建一个非聚集索引,在LastName上创建另一个索引,那么我的前两个查询将得到满足。显然,SQL Server 将对其他查询使用索引交集

或者,如果我在 (FirstName) 和 (LastName, FirstName) 上有索引对象,SQL Server 是否可以/是否将第二个索引用于仅对LastName的查询以及对两者的查询?

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

4

3 回答 3

10

SQL Server 是否可以/是否使用索引 (LastName, FirstName) 仅对 LastName 进行查询以及对两者进行查询?

是的,数据库将使用索引 (LastName, FirstName) 来查询 LastName。不过,它不会将此索引用于仅对 FirstName 的查询。

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

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

于 2010-02-09T10:14:19.017 回答
1

是的,如果您仅查询 LastName,它应该使用 (LastName, FirstName) 索引。因此,它既可以单独使用 LastName 查询,也可以同时使用 LastName 和 FirstName 查询。

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

于 2010-02-09T10:14:37.783 回答
1

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

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

于 2010-02-09T10:54:47.347 回答