首页 > 数据库 >SQL Server索引查找/扫描没有出现key lookup的案例浅析

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

时间:2024-03-14 10:33:05浏览次数:30  
标签:OBJECT Server 索引 查找 lookup TEST ID 浅析

在我们讲解这个案例前,我们先来了解/预热一下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 *的话,你就会看到书签查找了。如下所示

PS:有些技术落下久了,感觉就生疏、荒废了一样。真的是业精于勤荒于嬉!

标签:OBJECT,Server,索引,查找,lookup,TEST,ID,浅析
From: https://www.cnblogs.com/kerrycode/p/18072302

相关文章

  • zabbix-server-pgsql docker镜像说明
    0说明zabbix-server-pgsql在dockerhub的官方说明,供查阅1EnvironmentVariables1.1基本变量Whenyoustartthezabbix-server-pgsqlimage,youcanadjusttheconfigurationoftheZabbixserverbypassingoneormoreenvironmentvariablesonthedockerruncomm......
  • 【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis serv
    问题描述在AKSPod中连接AzureRedis服务,大概率出现连接不上的问题。大多数的错误为 RedisConnectionException:UnabletoconnecttoRedisserver:xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380,但是有时候的错误信息为: RedisConnectionException:Unable......
  • 2024年Java中文乱码浅析及解决方案(超详细)
    嗨,亲爱的Java新手们!今天我们要聊聊一个在编程世界里经常会遇到的头疼问题——中文乱码。想象一下,你写了一段充满创意的代码,里面包含了优美的中文注释和字符串,结果运行时,它们变成了乱七八糟的字符。别担心,这就像拼图游戏里的一块块碎片,只要找到正确的拼图方法,就能恢复它们的......
  • docker 制作与使用 arcgisserver 镜像
    PS:有状态服务本身不适合部署到容器中,数据恢复比较困难,生产环境请直接安装到Linux服务器中1.准备内容在同级目录下,准备以下内容空的dockerfile文件:arcgisserver.dockerfilelinux版的ArcGISServer安装包:ArcGIS_Server_Linux_xxxxxx.tar.gzArcGISServer的许可文件:ArcGI......
  • 关于Sql server数据类型HierarchyID 数据类型用法和递归显示完整路径
    SQLServer2008版本之后的新类型HierarchyID不知道大家有没有了解,该类型作为取代id,parentid的一种解决方案,让人非常惊喜。官方给的案例浅显易懂,但是没有实现我想要的基本功能,树形结构中完整名称路径的展示。本文末尾是一个完整路径的样例,需要更多基本操作可以参考文末微软链......
  • SQL Server 因设置最大内存过小导致无法启动
    首先是    在服务器上发现SQLServer占用内存过大,128G服务器内存它占用高达100多G。于是就去找解决方案,找了几篇文章发现都是通过修改SQLServer服务器最大内存让其释放占用内存,如图所示,我把最大内存修改为128MB发现问题    然后我就发现我的SQLServer服务无......
  • 爆款游戏如何借助 RocketMQ Serverless,打造流畅体验并节省 98% 成本?
    作者:鼎岳、稚柳、勇猛、家泽一款游戏作品之所以能在市场上引爆热潮,铸就爆款传奇,除了独树一帜的创新设计理念、引人入胜的故事情节和丰富多样的玩法机制之外,最核心的要素就是为玩家提供极致流畅且无与伦比的游戏体验。这种体验涵盖了从游戏载入速度、画面帧率稳定性、操作响应灵敏......
  • Windows Server 各版本搭建终端服务器实现远程访问(03~19)
    一、WindowsServer2003左下角开始➡管理工具➡管理您的服务器,点击添加或删除角色点击下一步 勾选自定义,点击下一步蒂埃涅吉终端服务器,点击下一步 点击确定重新登录后点击确定点击开始➡管理工具➡计算机管理,展开本地用户和组,点击组可以发现有个组关门用来远程......
  • SqlServer函数大全三十八:DATEPART函数
    在SQLServer中,DATEPART 函数用于返回日期/时间值的指定部分的整数。与 DATENAME 函数不同,DATEPART 返回的是一个数字,而不是一个字符串。这对于需要进行数学计算或比较的场合特别有用。函数的语法如下:sql复制代码DATEPART(datepart,date)其中:datepart 是你想......
  • SqlServer函数大全三十九:CONVERT函数
    在SQLServer中,CONVERT 函数用于将一种数据类型转换为另一种数据类型。这在处理日期、时间、数字和其他数据类型时非常有用,尤其是当你需要确保数据以特定的格式或类型进行存储或显示时。函数的语法如下:sql复制代码CONVERT(data_type[(length)],expression[,style])......