假设您有一个员工表,如下所示:
CREATE TABLE Employee(EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
LastName VARCHAR(50),
FirstName VARCHAR(50),
HireDate DATETIME,
Salary DECIMAL)
您将在 EmployeeID 上拥有主聚集键,并可能在 (LastName,FirstName) 上拥有非聚集键,以便能够按姓名查找员工。
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
现在,如果您需要找到“Joe Murphy”并检索他的雇用日期和薪水,会发生的情况是在基于名称的非聚集键中进行索引查找(这很好),但随后为了获取雇用日期和薪水,SQL Server 需要对实际表数据进行所谓的书签查找,以获取 Joe Murphy 的记录。这很可能会导致一次或多次物理磁盘访问(这在性能方面很糟糕)。
但是:如果基于名称的非聚集索引还指定“INCLUDE (HireDate, Salary)”:
CREATE INDEX NameIndex ON Employee(LastName ASC, FirstName ASC)
INCLUDE (HireDate, Salary)
然后 SQL Server 在非聚集名称索引中查找 Joe Murphy 后就完成了 --> 满足查询的所有字段都在非聚集索引中,因此不再需要进行磁盘密集型书签查找您的查询可能会更快。
INCLUDE 列的缺点是非聚集索引所需的磁盘空间增加,因为它们的叶级节点中包含包含的列。这是速度和大小之间的权衡(像往常一样)。
Marc