SQL Server索引查找/扫描没有出现key lookup的案例浅析

这篇具有很好参考价值的文章主要介绍了SQL Server索引查找/扫描没有出现key lookup的案例浅析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在我们讲解这个案例前,我们先来了解/预热一下SQL Server的两个概念:键查找(key lookup)和RID查找(RID lookup),通常,当查询优化器使用非聚集索引进行查找时,如果所选择的列或查询条件中的列只部分包含在使用的非聚集索引和聚集索引中时,就需要一个查找(lookup)来检索其他字段来满足请求。对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup),这种查找即是——书签查找(bookmark lookup)。在其他数据库概念中,可能又叫回表查询之类的概念。

那么我们先来构造案例所需的测试环境。下面测试环境为SQL Server 2014。

SELECT * INTO TEST FROM SYS.OBJECTS

CREATE CLUSTERED INDEX PK_TEST ON TEST(OBJECT_ID, NAME,CREATE_DATE)

CREATE INDEX IX_TEST_N1 ON TEST(PARENT_OBJECT_ID, TYPE)

UPDATE STATISTICS TEST WITH FULLSCAN;

如上所示,表TEST在字段OBJECT_ID, NAME,CREATE_DATE建立了聚集索引,然后下面这种查询语句,你查看其实际执行计划

SELECT OBJECT_ID, NAME,CREATE_DATE,PARENT_OBJECT_ID, TYPE 
FROM TEST WHERE PARENT_OBJECT_ID=2255213;

你会发现,SQL Server优化器走索引IX_TEST_N1查找就返回了所有数据。没有书签查找(回表查询),那么这是为什么呢?朋友这样问我的时候,我还真没有想明白。难道索引IX_TEST_N1中也会存储OBJECT_ID, NAME,CREATE_DATE的值? 当然你构造其它的案例时,有可能是索引IX_TEST_N1扫描就返回了数据。不会发生书签查找。

SQL Server索引查找/扫描没有出现key lookup的案例浅析

后面才想明白,非聚集索引中的索引行指向数据行的指针称为行定位器。 行定位器的结构取决于数据页是存储在堆中还是聚集表中。 对于堆,行定位器是指向行的指针。 对于聚集表,行定位器是聚集索引键。这是不是有点眼熟,类似于MySQL InnoDB的二级索引(Secondary Index)会自动补齐主键,将主键列追加到二级索引列后面。所以执行计划就走索引IX_TEST_N1查找就能返回数据了。根本不需要书签查找(回表查询)。如果查询语句多一个字段或者是SELECT *的话,你就会看到书签查找了。如下所示

SQL Server索引查找/扫描没有出现key lookup的案例浅析

PS:有些技术落下久了,感觉就生疏、荒废了一样。真的是业精于勤荒于嬉!文章来源地址https://www.toymoban.com/news/detail-839733.html

到了这里,关于SQL Server索引查找/扫描没有出现key lookup的案例浅析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server 数据操控,视图和索引

    此查询过程相当于: (1)理解索引的概念: 当表的数据量比较大时,查询操作会比较耗时。这时候建立索引是加快查询速度的有效手段,它能快速定位到需要查询的内容。用户可以根据需要在基本表上建立一个或多个索引,用来提供多种存取路径,加快查找速度。 (2)建立

    2024年02月01日
    浏览(41)
  • 浅谈SQL Server索引视图(物化视图)以及索引视图与查询重写

    目录 (一)前言 (二)正文 1. 物化视图(索引视图)与查询重写的基本概念 2. 创建测试环境 (1)建表 (2)写数据 3. 索引视图创建 (1)创建语法 (2)为索引视图创建索引  4. 查询重写 5. 为什么查询会被重写  6. 索引视图什么时候更新 7. 改变基于视图的查询 之前做

    2024年02月05日
    浏览(68)
  • SQL server查看各表的索引

    1、要查看 SQL Server 数据库中的索引,可以使用如下 SQL 语句: 这条 SQL 语句查询了系统元数据表,包含了以下信息: - 表名 - 索引名 - 索引类型(聚集索引或非聚集索引) - 是否是唯一索引 - 是否是主键索引 - 索引包含的列名 执行上述 SQL 语句,将返回数据库中所有表的所有

    2024年02月05日
    浏览(38)
  • SQL Server数据库 -- 索引与视图

    一、索引 聚集索引 非聚集索引 二、视图 三、自定义函数 标量函数 表值函数 四、游标 五、总结 在学习完创建库表、查询等知识点后,为了更加方便优化数据库的存储和内容,我们需要学习一系列的方法例如索引与视图等等,从而使我们更加熟练和使用数据库,突破表面,

    2024年02月14日
    浏览(48)
  • 【SQL server】视图和索引的创建与管理

    本实验数据来源课参照一下本专栏文章: 【SQL server】进行简单查询分组、连接查询子查询和汇总(含teaching数据库创建及实验拓展)_Deep-sea shark的博客-CSDN博客_sql 分组汇总 视图是一张虚表,数据库中只存储视图的定义,而不存储视图对应的数据(除非是索引视图)。 视图可

    2024年02月04日
    浏览(34)
  • SQL Server对象类型(2)——索引(Index)(3)

    说完了簇索引,接下来我们再说说非簇索引,与Oracle中的普通B-tree索引类似。SQL Server中的非簇索引,首先,其也是通过一个B-tree结构进行组织和存储,该结构同样分为根节点/数据页(Root Node/Page)、中间节点/数据页(Intermediate Nodes/Pages)和叶子节点/数据页(Leaf Nodes/Pages),

    2024年02月11日
    浏览(42)
  • 通过空间占用和执行计划了解SQL Server的行存储索引

    索引是一种帮助查询语句能够快速定位到数据的一种技术。索引的存储方式有行存储索引、列存储索引和内存优化三种存储方式: 行存储索引,使用B+树结构,行存储指的是数据存储格式为堆、聚集索引和内存优化表的表,用于OLTP场景。行存储索引按顺序排列的值列表,每个

    2024年02月04日
    浏览(84)
  • SQL Server 2019安装后出现连接失败

    最近因学习数据库系统原理,下载安装了一个2019版本的,启动服务后,发现使用Aqua Data Studio根本连不上,打开设备管理器 一看1433端口没有监听; 于是在网站上搜索解决方案,基本上都是说在 SQLServer的管理配置界面设置一下,TCP/IP的端口即可。也的确如此;但是我配置完端

    2023年04月09日
    浏览(49)
  • Sourcetree git 出现 The server‘s host key is not cached in the registry问题的解决办法

    省流: 参考博文:https://blog.csdn.net/sryan/article/details/50717528 Sourcetree会自带plink,用命令行切换到plink.exe所在路径,并执行plink git@github.com 命令,根据提示输入y 回车,问题就解决了。本质上是plink问玩家要y还是n,但是在Sourcetree的错误提示那里不能输入。 问题描述: 这几天用

    2024年02月03日
    浏览(40)
  • 连接服务器中的SQL Server出现53错误

    你可以参照这张图,看你是否打开了tcp和数据的远程连接 当以上配置之后还是显示53号错误的话,你首先可以先尝试在服务器上连接数据库,看是否会报错,如果不会的话,就可以接下来的操作了 去查看服务器配置的安全组是否打开了1433端口 如果服务器没有打开1433端口的话

    2024年02月11日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包