SQL Server 中的覆盖索引

1. 覆盖索引的工作原理

当查询只涉及索引中已经包含的列时,SQL Server 可以直接使用索引来返回查询结果,而不需要回表到数据页去检索实际的数据行。覆盖索引因此能够显著减少 I/O 操作,提高查询效率。

例如,假设有一个表 Employees,包含以下列:

CREATE TABLE Employees (id INT PRIMARY KEY,name VARCHAR(100),age INT,salary DECIMAL(10, 2)
);

如果你为 namesalary 列创建了一个复合索引:

CREATE INDEX idx_name_salary ON Employees(name, salary);

那么在以下查询中,SQL Server 将使用该覆盖索引:

SELECT name, salary FROM Employees WHERE name = 'John Doe';

因为查询只涉及 namesalary,SQL Server 可以直接从索引中获取结果,而不需要访问表中的数据行。

2. 覆盖索引的创建

为了优化查询性能,SQL Server 提供了包括列(INCLUDE)的功能,允许你在索引中包含额外的列,这些列不会作为索引的排序依据,但会存储在索引叶子节点中,供查询时直接使用。

例如,假设你经常执行如下查询:

SELECT name, salary, age FROM Employees WHERE salary > 50000;

你可以创建一个索引,其中包括 namesalary 作为索引的排序列,并将 age 列作为“包括列”:

CREATE INDEX idx_salary_name IN Employees(salary, name)
INCLUDE (age);

此时,salaryname 列作为排序列,age 列作为包括列,这样 SQL Server 在执行查询时就能直接从索引中获取所有所需的列,避免了回表操作。

3. SQL Server 的覆盖索引优势
  • 性能提升:避免回表,减少磁盘 I/O,查询结果可以直接从索引中返回,性能得到提升。
  • 存储优化:合理使用 INCLUDE 子句,可以避免将所有查询字段都作为排序列,从而减少索引的大小。
4. 使用 INCLUDE 子句

在 SQL Server 中,INCLUDE 子句是优化覆盖索引的重要工具。它允许你在索引中包含额外的列,而不会影响索引的排序方式,且这些列仅用于覆盖查询。

例如,以下索引创建语句:

CREATE INDEX idx_name_salary INCLUDE (age);

该索引会包括 namesalary 作为排序列,并且在索引的叶子节点中包含 age 列。当查询涉及 namesalaryage 时,SQL Server 会使用此索引覆盖查询,而不需要访问数据表。

5. 注意事项
  • 索引大小:覆盖索引的大小可能会变得较大,尤其是当你包含多个列或大列时,因此要小心选择需要覆盖的列。
  • 更新开销:如果索引涉及频繁更新的列,维护覆盖索引的开销可能会增加。
6. 例子总结

假设你有一个查询:

SELECT name, salary FROM Employees WHERE salary > 50000;

如果你创建如下的索引:

CREATE INDEX idx_salary_name ON Employees(salary, name);

那么这个查询将完全由覆盖索引处理,SQL Server 不需要回表。假如查询涉及更多列,例如:

SELECT name, salary, age FROM Employees WHERE salary > 50000;

那么你可以创建一个包含 age 列的索引:

CREATE INDEX idx_salary_name_age ON Employees(salary, name) INCLUDE (age);

在这种情况下,SQL Server 会使用该索引覆盖查询,不需要回表到 Employees 表来查找 age 列的数据。

总结

SQL Server 中的覆盖索引与其他数据库系统的概念非常相似,都是通过索引中包含查询所需的所有列来避免回表,从而提升查询性能。SQL Server 通过 INCLUDE 子句提供了更大的灵活性,使得覆盖索引的创建可以更加精细和高效。

创建覆盖索引的脚本与普通索引脚本是类似的,但有一个关键的区别:在创建覆盖索引时,通常会使用 INCLUDE 子句来指定额外的列,使索引包含查询所需的所有字段,而不影响索引的排序列。

1. 普通索引创建脚本

普通索引创建脚本通常只指定索引的排序列。例如:

CREATE INDEX idx_name_salary ON Employees(name, salary);

这个索引 idx_name_salary 是一个普通的非覆盖索引,它按 namesalary 列排序。如果查询只涉及 namesalary,这个索引就能加速查询。但如果查询还需要其他列(比如 age),SQL Server 仍然需要回表去查找这些列的数据。

2. 覆盖索引创建脚本

覆盖索引的创建脚本除了指定排序列外,还会使用 INCLUDE 子句将额外的列包含在索引的叶子节点中,这样可以避免回表。例如,如果你希望查询涉及 namesalaryage,你可以创建一个覆盖索引,包含所有需要的列:

CREATE INDEX idx_name_salary_age ON Employees(name, salary)
INCLUDE (age);

在这个例子中:

  • name 和 salary 是排序列,它们决定了索引的组织方式。
  • age 列是通过 INCLUDE 子句包含在索引中的,它不会影响索引的排序方式,但是查询中需要 age 时,SQL Server 会直接从索引中获取它,而无需回表去查找实际的数据。

3. 总结区别

  • 普通索引:只有排序列,没有使用 INCLUDE 子句,适用于仅查询排序列的情况。
  • 覆盖索引:使用 INCLUDE 子句将额外的列包含在索引中,适用于查询包含多个列时,避免回表。

示例比较

  • 普通索引
CREATE INDEX idx_name_salary ON Employees(name, salary);
  • 覆盖索引
CREATE INDEX idx_name_salary_age ON Employees(name, salary)
INCLUDE (age);

关键点

  • INCLUDE 子句只是用来将非排序列(查询需要的列)包括进索引叶子节点,以提高查询性能。
  • 在大多数情况下,只有当查询涉及多个列时,才使用覆盖索引。如果查询只涉及少数几列,使用普通索引可能更合适。

这样,覆盖索引的创建脚本和普通索引脚本的区别就是是否使用了 INCLUDE 子句。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GOOD】A Survey of Deep Graph Learning under Distribution Shifts

深度图学习在分布偏移下的综述:从图的分布外泛化到自适应 Northwestern University, USA Repository Abstract 图上的分布变化——训练和使用图机器学习模型之间的数据分布差异——在现实世界中普遍存在,并且通常不可避免。这些变化可能会严重恶化模…

【Axure高保真原型】环形进度条(开始暂停效果)

今天和大家分享环形进度条(开始暂停效果)的原型模版,效果包括: 点击开始按钮,可以环形进度条开始读取,中部百分比显示环形的读取进度; 在读取过程中,点击暂停按钮,可以随…

Euler 21.10(华为欧拉)安装oracle19c-RAC

1. Euler 21.10安装oracle19c-RAC 1.1. 环境规划 1.1.1. 主机规划 hostname IP 实例名 hfdb90 192.168.40.90 hfdb1 hfdb91 192.168.40.90 hfdb2 系统版本 BigCloud Enterprise Linux For Euler 21.10 (GNU/Linux 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 x86_6…

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图(Radar Chart),也被称为蛛网图或星型图&…

Business Cooperation Process

Business Cooperation Process 商务合作基本流程 并不是每个人都能做到言而有信的,因此还是需要流程来约束的。

模式识别-Ch2-分类错误率

分类错误率 最小错误率贝叶斯决策 样本 x x x的错误率: 任一决策都可能会有错误。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

Milvus×全诊通:从导诊到智能超声,如何将人效比翻倍

AI与智慧医疗的结合已是未来发展的必然趋势。近年来,国家卫健委推崇智慧医疗和AI技术,如智能导诊、预问诊、辅助诊断等,以提高医疗服务效率和诊断准确性,改善患者就医体验。 全诊通是一家专注于医疗SaaS和人工智能的公司&#xff…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具,故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著;出版时间:2023年3月 二、图像的分类、分割与检测任务区别 如图所示,这些更高阶的…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合,它提供了一套完整的工具集,用于快速构建分布式系统。在Spring Cloud的架构中,服务被拆分为一系列小型、自治的微服务,每个服务运行在其独立的进程中,并通过…

【PLL】非线性瞬态性能

频率捕获、跟踪响应,是大信号非线性行为锁相范围内的相位、频率跟踪,不是非线性行为 所以:跟踪,是线性区域;捕获,是大信号、非线性区域 锁定范围:没有周跳(cycle-slipping&#xff0…

QML学习(七) 学习QML时,用好Qt设计器,快速了解各个组件的属性

在初步学习QML时,特别建议看看Qt设计器,先利用Qt Quick设计师的使用,快速的对Qt Quick的各个组件及其常用的属性,有个初步的了解和认识。如果初始学习一上来直接以代码形式开干,很容易一头雾水。而设计器以最直白的所见…

find 查找文件grep匹配数据

一、find介绍 1. find . -iname "*.txt"查找当前目录下各个文件夹下的txt属性的文件(i忽略大小写)。 2.find . -type f 查找当前目录下各个文件夹下的文件 3.find . -type d 查找当前目录下各个文件夹下的目录 4.find . -type f | xargs grep -ain -E "匹配…

Mac上鸿蒙配置HDC报错:zsh: command not found: hdc -v

这个问题困扰了好久,按照官方文档去配置的,就是会一直报错,没有配置成功,主要原因是官网ide的路径可能和你本地的ide的路径不一致,因为官网的ide版本可能是最新的 一.先查找你本地的toolchains目录在哪里,…

CS·GO搬砖流程详细版

说简单点,就是Steam买了然后BUFF上卖,或许大家都知道这点,但就是一些操作和细节问题没那么明白。我相信,你看完这篇文章以后,至少会有新的认知。 好吧,废话少说,直接上实操! 首先准…

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的,所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示: FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据,然后SDL将YUV显示到电脑屏幕上…

【Linux】Linux开发:GDB调试器与Git版本控制工具指南

Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建 在 Linux 开发中,GDB 调试器和 Git 版本控制工具是开发者必备的利器。GDB 帮助快速定位代码问题,G…

【设计模式-2】23 种设计模式的分类和功能

在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…

谷粒商城-高级篇完结-Sleuth+Zipkin 服务链路追踪

1、基本概念和整合 1.1、为什么用 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位 。主要体现在&#…

基于Python的音乐播放器 毕业设计-附源码73733

摘 要 本项目基于Python开发了一款简单而功能强大的音乐播放器。通过该音乐播放器,用户可以轻松管理自己的音乐库,播放喜爱的音乐,并享受音乐带来的愉悦体验。 首先,我们使用Python语言结合相关库开发了这款音乐播放器。利用Tkin…

实际开发中,常见pdf|word|excel等文件的预览和下载

实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…