SQL Server 聚集索引非聚集索引键查找过程详解

索引的相关术语

1 堆(Heap)是一种没有指定排序的数据结构,通俗的理解堆就像是按照顺序排放的杂物。在数据库里也即是对应没有聚集索引。

2 聚集索引:一个表只有一个聚集索引且数据存放在聚集索引内。

3 非聚集索:是一个B-树(B-Tree)结构,它包含了索引键和指向数据行的指针。

我们可以在堆或聚集索引类型的表里创建非聚集索引。一个表的非聚集索引最多支持999个。在覆盖索引的应用场景下,可以定义非聚集索引时指定包含(include)其它字段。

4 唯一索引:唯一索引不允许表里的指定的列数据有重复的值,一个表可以有一个或多个唯一索引。

5 主键:主键是一个表里每行记录的唯一标识同时默认情况下也是聚集索引。

6 RID lookup 堆形式的表的执行计划里通过ROW id映射匹配其它非聚集索引字段的操作。

7 key lookup 聚集索引形式的表执行计划里通过主键映射匹配其它非聚集索引字段的操作。

聚集索引的演示案例

添加主键

-- 删除原有的索引
DROP INDEX EMPLOYEES.[IX_EMP_NAME]
ALTER TABLE EMPLOYEES ADD CONSTRAINT PK_EMPLOYEES_ID PRIMARY KEY(id);
GO

系统表查看当前表的类型

SELECT * FROM sys.indexes
WHERE object_id = OBJECT_ID('dbo.EMPLOYEES')

无索引下WHERE查询

--查询名字是ABC 874000的员工信息。
-- 执行时点击SSMS里的“包括实际的执行计划按钮”菜单(或者用CTRL+M快捷键)。
SELECT * FROM EMPLOYEES
WHERE NAME = 'ABC 874000'

这里因为是建了聚集索引,表数据存储在索引的叶子节点,所以应用的clustered index scan,读取的行数还是100W,所有实际执行的行数为1行。

非聚集索引下WHERE查询

--在NAME字段上建立非聚集索引。
CREATE NONCLUSTERED INDEX IX_EMP_NAME ON EMPLOYEES(NAME)-- 再次执行WHERE查询并含实际执行计划。
SELECT * FROM EMPLOYEES
WHERE NAME = 'ABC 874000'

Key映射查找

查询例子同上。

上例的执行计划中我们可以看到key lookup过程,这个映射查找出现的原因是我们的查询里name字段虽然可以在非聚集索引IX_EMP_NAME上支持获取到,但id、email、dept而这些信息则需要通过聚集索引里的记录ID来映射匹配到。为了区分堆形式的RID lookup,这里用的标识是key lookup。

Key Lookup示意

通过上图我们可以看到在非聚集索引的叶子节点里存放了索引字段和主键(如Employeeid),而通过主键可以找到记录的所有的字段。

SQL Server 聚集索引 clustered index 非聚集索引Nonclustered Indexes键查找查找Key Lookup执行计划过程详解相关推荐

  1. SQL Server 堆heap 非聚集索引 Nonclustered index 行号键查找RID loopup结合执行计划过程详解

    SQL Server 堆型数据与执行计划使用案例 索引的相关术语 1 堆(Heap)是一种没有指定排序的数据结构,通俗的理解堆就像是按照顺序排放的杂物.在数据库里也即是对应没有聚集索引. 2 聚集索引 ...

  2. sqlserver聚合索引(clustered index) / 非聚合索引(nonclustered index)的理解

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索 ...

  3. SQL Server 2017 2019 Linux(Centos、Unbuntu16.04、Unbuntu18.04、Unbuntu20.04)安装过程详解

    SQL Server 2017 2019 Linux安装手册 1简介 SQL Server是微软的数据库平台,而SQL Server 2017 linux是运行在linux服务器上的版本.本文的安装采 ...

  4. 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED)

    唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一索引(UNIQUE) 聚集索引(CLUSTERED) 非聚集索引(NONCLUSTERED) 唯一 ...

  5. sql server 2008学习3 表组织和索引组织

    表组织 表包含在一个或多个分区中,每个分区在一个堆或一个聚集索引结构包含数据行.堆页或聚集索引页在一个或多个分配单元中进行管理,具体的分配单元数取决于数据行中的列类型. 聚集表.堆和索引 SQL Se ...

  6. SQL Server中的聚集索引(clustered index) 和 非聚集索引 (non-clustered index)

    1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 2. 聚合索引和非聚合索引有什么区别? 深入浅出理解索引结构 实际上,您可以把索 ...

  7. SQL Server索引概要(2)-非聚集索引(Non-Clustered Index)

    介绍 在上一篇SQL Server 聚集索引概述 中,我们探讨了 SQL Server 中索引和聚集索引的要求. 在我们继续之前,让我们快速总结一下 SQL Server 聚集索引: 它根据聚集索引键 ...

  8. SQL Server索引概要(1)-聚集索引(Clustered Index)

    介绍 索引在 SQL Server 查询性能中起着至关重要的作用.考虑一个拥有数千本书的图书馆. 您想搜索标题中包含关键字"冒险"的特定书籍.图书馆里的书杂乱无章. 您需要从书架上 ...

  9. 聚合索引(clustered index) 和 非聚合索引(nonclustered index)

    以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好..  各位在我收集每个人擅长的东西时,大部分都把SQL SERVER 标为Expert,看看是 ...

最新文章

  1. 39岁单身程序员入住养老院,提前过上退休生活?网友:羡慕又心酸!
  2. 2021-07-01带Left Join的SQL语句的执行顺序
  3. 自我监督学习:AI技术的未来发展方向
  4. XIV(5)-- Data Recovery Protection (XDRP)
  5. Mysql索引命中问题
  6. java学习(二)--- 变量类型
  7. creator 静态属性_cocos creator 属性面板设置
  8. matlab中edge函数,matlabedge函数用法
  9. 计算机故障语言 英语怎么说,故障英语怎么说
  10. hex(base16)、base32、base64三种编码方式区别
  11. 【读书笔记】看你能坚持读几本书?!——三十本互联网必看书籍
  12. JavasScript 第一天课 课后笔记 2022.3.21
  13. android手机 手动 清理缓存,安卓手机缓存怎么清理_安卓手机清理缓存的具体步骤-系统城...
  14. 手持设备的可用性研究
  15. 前洛克希德马丁高工谈宽带RF接收机架构
  16. CKEditor和CKFinder及CKEditor配置属性说明
  17. 小甲鱼第5章:列表、元组和字符串(半整理)
  18. 安徽事业单位考试计算机基本知识,2017安徽事业单位考试备考资料:计算机知识(文字处理软件World)...
  19. 西南大旱之女娲补天谭: 水哪里去了?
  20. html表单边框怎么加颜色?html form标签的边框颜色实例

热门文章

  1. VTK:绘制圆圈用法实战
  2. JavaScript实现递归楼梯问题(蛮力解决方案)算法(附完整源码)
  3. boost::test::string_token_iterator相关的测试程序
  4. Boost:标准地图比较的测试程序
  5. Boost:boost::asio模块的prioritised handlers优先处理程序
  6. ITK:复制复合变换CompositeTransform
  7. VTK:可视化之VectorOfActors
  8. OpenCV坎尼探测器Canny Detector的实例(附完整代码)
  9. Qt Creator部署到设备
  10. C++实现0-1-knapsack背包问题 (附完整源码)