CREATE NONCLUSTERED INDEX index_name ON <object> ( column [ ASC | DESC ] [,...n ] ) [ INCLUDE ( column_name [,...n ] ) ] [ WHERE <filter_predicate> ]
在上面的语法中,我们将在INCLUDE中指定非键列.指定非键列有什么好处?
解决方法
假设你有一个像这样的员工表:
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列的缺点是非聚簇索引增加了磁盘空间需求,因为它们的叶级节点中将包含列.这是速度和尺寸之间的权衡(像往常一样).
渣