说我有一张桌子:
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?或者可以随意选择一个吗?
答案 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子句。它是任何索引策略的一个被忽视但非常有用的补充。