将 INCLUDE 列与 SQL Server 索引一起使用有什么优点?

2024-04-23

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 列的缺点是非聚集索引所需的磁盘空间增加,因为它们的叶级节点中包含包含的列。这是速度和大小之间的权衡(像往常一样)。

Marc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 INCLUDE 列与 SQL Server 索引一起使用有什么优点? 的相关文章

  • 浮点转换和性能

    我知道在浮点数和整数之间进行转换时可能会出现错误 但是性能如何 请忽略准确性问题 一般来说 如果我对不同算术类型的操作数 即不同的浮点类型 例如 float and double 和浮点 整数类型组合 例如float and int 是否存
  • 编译 32 位和 64 位时性能差异巨大(快 26 倍)

    我试图衡量使用的差异for and a foreach访问值类型和引用类型的列表时 我使用以下课程来进行分析 public static class Benchmarker public static void Profile string
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • 在任何 PostgreSQL 语句(甚至不返回结果的语句)上调用 row_to_json(row)

    我正在寻找始终从 PostgreSQL 语句返回 JSON 表示的查询 即使没有returning 这是一个例子 WITH result AS insert into users name age values drew 42 select
  • parseInt() 和 Number() 有什么区别?

    How do parseInt https developer mozilla org en US docs Web JavaScript Reference Global Objects parseInt and Number https
  • 无法绑定多部分标识符

    我在 SO 上看到过类似的错误 但我找不到解决我的问题的方法 我有一个 SQL 查询 例如 SELECT DISTINCT a maxa b mahuyen a tenxa b tenhuyen ISNULL dkcd tong 0 AS
  • 使用 MOVE 确定 DB RESTORE 的 SQL 数据路径

    我正在尝试编写一个自动恢复数据库备份的脚本 我知道我可以使用以下 RESTORE 命令 RESTORE DATABASE DBRestoredName FROM DISK N C path to backup bak WITH FILE 1
  • 如何选择按范围分组的值的计数

    斯塔克万岁 我需要选择按范围分组的值的计数 举例来说 假设我在表列中有以下值 1 2 4 5 6 8 9 11 13 16 然后 我想检索 5 范围内它们的计数 如下所示 From 0 to 4 there is 3 values 1 2
  • 计算日期之间的差异 - Postgres

    我需要计算 3 个不同日期的天数 我需要运行逻辑以从下面的伪逻辑获取整数值 future date 1 future date 2 今天 如何在 PostgreSQL 中实现这一点 为了实现日期相差天数 SELECT DATE PART d
  • 在 SQL 中将 CSV 字段拆分为不同的行

    我的一位同事在做COBOL程序时遇到了这个问题 最终在应用程序层面解决了它 我仍然很好奇是否可以使用 SQL 在数据访问级别上解决它 这在某种程度上与这另一个问题 https stackoverflow com questions 2903
  • 从 Javascript 读取当前文档的大小

    我开始玩回旋镖 https github com yahoo boomerang用于测量性能 这是非常有前途的 虽然它允许我测量延迟 带宽和页面加载时间 但我也有兴趣尝试获取在服务器端渲染初始 HTML 页面所需的时间 虽然记录浏览器开始解
  • SQL SERVER 字符串中的掩码字符

    如何替换 SQL SERVER 中字符串中 x 和 y 字符之间的字符 例如 如果我有 TEST123456 最后有 TE 56 我不知道字符串有多长 但我知道我需要屏蔽字符串中 x 和 y 之间的字符 你可以使用REPLICATE htt
  • MySQL:选择 DISTINCT / UNIQUE,但返回所有列?

    SELECT DISTINCT field1 field2 field3 FROM table 我正在尝试完成以下 SQL 语句 但我希望它返回所有列 这可能吗 像这样的东西 SELECT DISTINCT field1 FROM tabl
  • TSQL 多列唯一约束也允许多个 Null

    我目前正在做一些从 MS Access 到 SQL Server 的迁移 Access 允许唯一索引中存在多个 Null 而 SQL Server 不允许 我一直在通过删除 SQL Server 中的索引并添加筛选索引来处理迁移 CREAT
  • PostgreSQL 列“foo”不存在

    我有一个表 其中有 20 个整数列和 1 个名为 foo 的文本列 如果我运行查询 SELECT from table name where foo is NULL 我收到错误 ERROR column foo does not exist
  • Android:RunOnUiThread 与 AsyncTask

    我相信 Google 建议开发人员使用 AsyncTask 但是 我想知道它与使用 new Thread 然后调用 RunOnUiThread 在性能和内存效率方面有何不同 使用 RunOnUithread 的示例 some code 1
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • oracle 计算两个字符串中连续匹配的单词

    我想要一个返回两个字符串中单词的顺序匹配数的查询 例子 Table Id column1 column2 result 1 foo bar live foo bar 2 2 foo live tele foo tele 1 3 bar fo
  • 网站性能衡量

    我需要一个免费的工具来测量网站的性能 并且不需要对代码 jsp asp 页面 进行任何更改 感谢所有帮助 对于绩效衡量 我建议您YSlow http developer yahoo com yslow 它是一个 Firefox 插件 集成了
  • 如何在JdbcTemplate中执行多批量删除?

    我想一次删除多个数据库条目 仅当 3 个字段匹配 此处 姓名 电子邮件 年龄 时 才应删除每个条目 如果我只想删除单个属性 我会选择 String sql DELETE FROM persons WHERE email IN JdbcTem

随机推荐