加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

使用带有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列的缺点是非聚簇索引增加了磁盘空间需求,因为它们的叶级节点中将包含列.这是速度和尺寸之间的权衡(像往常一样).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读