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索引查找/扫描内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MSSQL批量插入数据优化详细

    MSSQL批量插入数据优化详细

    这篇文章主要为大家分享一下批量插入数据的方法,有时候我们需要插入大量的数据那么就需要优惠了,要不根本受不了
    2017-07-07
  • SQLServer 游标的创建和使用基本步骤

    SQLServer 游标的创建和使用基本步骤

    游标主要用于存储过程、触发器或T-SQL脚本中,当需要遍历查询结果集中的每一行数据并进行操作时,游标就显得非常有用,本文给大家介绍SQLServer 游标的创建和使用基本步骤,感兴趣的朋友一起看看吧
    2024-08-08
  • SQL Server简单模式下误删除堆表记录恢复方法(绕过页眉校验)

    SQL Server简单模式下误删除堆表记录恢复方法(绕过页眉校验)

    这篇主旨是揭示堆表的删除记录找回的原理,我所考虑的方面并不适用于每个人的每种情况,望大家见谅
    2013-01-01
  • SQL Server中row_number函数用法入门介绍

    SQL Server中row_number函数用法入门介绍

    SQL ROW_NUMBER函数是临时值序列的非持久生成,并且在执行查询时会动态计算该函数,下面这篇文章主要给大家介绍了关于SQL Server中row_number函数用法的相关资料,需要的朋友可以参考下
    2023-03-03
  • MSSQL  附加数据库提示“错误 823”数据恢复实操

    MSSQL  附加数据库提示“错误 823”数据恢复实操

    这篇文章主要介绍了MSSQL 2000 附加数据库提示“错误 823”数据恢复实操,报错823一般数据库的物理页面出现了损坏或者校验值损坏导致数据库页面无法被识别还有异常断电导致的文件系统损坏,数据库页面丢失,下面针对错误 823对数据进行恢复,需要的朋友可以参考一下
    2022-03-03
  • sql中的常用的字符串处理函数大全

    sql中的常用的字符串处理函数大全

    这篇文章主要介绍了sql中的常用的字符串处理函数,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • 多列复合索引的使用 绕过微软sql server的一个缺陷

    多列复合索引的使用 绕过微软sql server的一个缺陷

    多列复合索引是指由多个字段组成的索引。这种情况相当常用的,并且,在查询中,用多列复合索引来指定搜索范围边界也相当常用
    2012-07-07
  • sql下三种批量插入数据的方法

    sql下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法,需要的朋友可以参考下
    2013-10-10
  • Mybatis中处理特殊SQL处理逻辑解析

    Mybatis中处理特殊SQL处理逻辑解析

    这篇文章主要介绍了Mybatis中处理特殊SQL处理逻辑,在MyBatis中可能会有一些特殊的SQL需要去执行,一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种,现在分别来进行说明,需要的朋友可以参考下
    2023-06-06
  • sql 多表连接查询

    sql 多表连接查询

    sql 多表连接查询语句代码,大家可以参考下。
    2009-06-06

最新评论