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

 更新时间:2024年03月18日 09:14:13   作者:潇湘隐者  
对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup),这种查找即是——书签查找(bookmark 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扫描就返回了数据。不会发生书签查找。

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

到此这篇关于SQL Server索引查找/扫描没有出现key lookup的案例浅析的文章就介绍到这了,更多相关SQL Server索引查找/扫描内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ASP数据库编程SQL常用技巧

    ASP数据库编程SQL常用技巧

    ASP数据库编程SQL常用技巧...
    2006-09-09
  • SqlServer字符截取的具体函数使用

    SqlServer字符截取的具体函数使用

    本文主要介绍了SqlServer字符截取的具体函数使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • sqlserver对字段的添加修改删除、以及字段的说明

    sqlserver对字段的添加修改删除、以及字段的说明

    sqlserver对字段的添加修改删除、以及字段的说明,需要的朋友可以参考下。
    2011-12-12
  • SQLServer 镜像功能完全实现

    SQLServer 镜像功能完全实现

    折腾SQLServer 镜像搞了一天,终于有点成果,现在分享出来,之前按网上做的出了很多问题。现在尽量把所遇到的问题都分享出来。
    2011-09-09
  • 开启SQL Server网络访问的详细教程(图文)

    开启SQL Server网络访问的详细教程(图文)

    目前工作中很少用到SQL Server了,最近需要测试几个表,需要搭建一个SQL Server数据库服务,这里做个总结吧,安装这里就不做详细介绍了,本文只介绍如何开启SQL Server网络访问,感兴趣的小伙伴跟着小编一起来看看吧
    2024-09-09
  • sqlserver存储过程中SELECT 与 SET 对变量赋值的区别

    sqlserver存储过程中SELECT 与 SET 对变量赋值的区别

    SQLServer中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT。对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种方式还是有很多差别的。
    2011-04-04
  • Navicat连接SQL Server数据库的详细指南

    Navicat连接SQL Server数据库的详细指南

    Navicat是一款功能强大的数据库管理工具,支持连接和管理SQLServer数据库,本文详细介绍了如何使用Navicat连接到SQLServer,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • sql语法中的concat()函数详解

    sql语法中的concat()函数详解

    SQL CONCAT 函数添加两个或多个字符或字符串以在结果中形成一个新字符串,这篇文章主要介绍了sql concat()函数,需要的朋友可以参考下
    2022-08-08
  • 深入SQL Server 跨数据库查询的详解

    深入SQL Server 跨数据库查询的详解

    本篇文章是对SQL Server中的跨数据库查询进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 在sqlserver数据库中导入Excel数据的全过程

    在sqlserver数据库中导入Excel数据的全过程

    在SQL Server中导入Excel数据可以通过使用导入/导出向导来完成,下面这篇文章主要给大家介绍了关于在sqlserver数据库中导入Excel数据的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01

最新评论