使用带有SQL Server索引的INCLUDE列有什么好处?
发布时间:2020-12-12 06:37:36 所属栏目:MsSql教程 来源:网络整理
导读:CREATE NONCLUSTERED INDEX index_name ON object ( column [ ASC | DESC ] [,...n ] ) [ INCLUDE ( column_name [,...n ] ) ] [ WHERE filter_predicate ] 在上面的语法中,我们将在INCLUDE中指定非键列.指定非键列有什么好处? 解决方法 假设你有一个像这样
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列的缺点是非聚簇索引增加了磁盘空间需求,因为它们的叶级节点中将包含列.这是速度和尺寸之间的权衡(像往常一样). 渣 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |