当只有一列是在WHERE子句中的SQL Server将使用复合索引?
-
19-09-2019 - |
题
说我有一个表:
CREATE TABLE Users (
Id INT IDENTITY (1, 1),
FirstName VARCHAR(40),
LastName VARCHAR(40)
)
查询通常是上姓或名字,而且还对姓 和强> 名字
如果我创建关于姓一个非聚集索引和另一名字,然后我的头两个查询照顾。显然,SQL Server将使用索引交集,在其他查询。
或者,如果我对(姓)和(姓,名)indexees,可/不SQL Server中使用的第二索引的查询对刚才名字以及查询在两个<? / p>
是否SQL Server存储化合物指数部分从左向右或从右到左?换句话说:将建立重点为LastNameFirstName或名姓?或者是可以自由选择一个任意?
解决方案
能/不SQL Server中使用的索引(姓氏,名字)的查询对刚才名字以及关于这两个查询?
是,该数据库将使用索引(姓氏,名字)的查询上名字。它将不会使用仅姓这个指数的查询,但。
它商店化合物指数部分从左向右或从右到左?
存储处于 B树。不管你认为它是存储从右到左或左到右的仅仅是一个有用的可视化的援助,并没有涉及到实际的数据存储。
其他提示
是的,如果你名字查询唯有它应该使用(姓氏,名字)指数。因此,这将被用于由两个单独姓氏,或者名字和姓查询一起时。
一般原则是,以确保具有最大选择性列首先出现在复合索引,因为这提供最大益处/缩小结果集以下之前向下越早,选择性较差列。
根据您要发送的实际查询,在两列复合索引可即使你只搜索第二列中。但是,你不会得到一个索引查找,但最有可能的索引扫描。如果这是你“足够好”,取决于具体的环境。索引更多的是一种艺术,而不是一门科学,有很多不同的因素都影响你的判断如何索引的表。它总是一个折衷具有桌子上太多的指标是一样太少一样糟糕。请确保您的最关键的查询被覆盖好,然后按个别情况决定的任何其他指数是否值得其成本。
此外,因为它尚未提及,并提供你至少在SQL Server 2005:让我对非聚集索引的INCLUDE子句中抛出。这是一个被忽视的,但真正有用的除了任何索引策略。