SQL Server执行计划那些事儿(3)——书签查找

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下。

在刚开始工作时候,总以自己有个“高科技”的工作,而感到特别神气,经常在其他人面前说一些让别人觉得高大上的措辞,到后来会在学妹面前炫耀的讲一下SQL Server的执行计划,这个时候别说执行计划了,就是SQL的优化对我来说还是个新鲜的事物,总是以自己能正确查出结果而沾沾自喜。然而,当真有不经世事的学妹会问我,执行计划是什么,我的回答:“就是......”,说的什么,我自己都不知道。

开门见山,直接入题

在查看SQL Sever执行计划的过程中,你是否曾经也和我一样,看到索引查找就欣喜若狂,万事大吉了呢,从来不会理会RID查找,键查找为何物,更不会管他们究竟是什么。但是,作为程序猿的我,为了能进化为人,我不得不去搞明白书签(RID,键值)为何物。

书签查找出现的情况:书签查找总是伴随着非聚集索引的查找而出现,但并不是所有的非聚集索引都会引起书签查找。在表以堆(不含聚集索引)的形式存储的时候,书签查找为RID查找,当表以树(含聚集索引)的形式存储时,书签查找为键查找。

书签查找为何物:当SQL Server查询优化器使用非聚集索引查找时,当该索引没有完全覆盖查询列和返回列时,就会引起书签查找。

RID是什么:当表以堆的形式存储的时候,数据行的物理位置是不会(严谨的说是很少)变动的,正是因为很少变动,所以,可以通过一个地址来唯一确定一行,又因为数据库的每一行一定存储在某一页上,而某一页又一定在某一数据库文件中,所以就可以通过文件号:页号:行号(如:1:22:14,指的就是第1个数据库文件的第22页中的第14行)。

键值书签是什么:当表以树的形式存储时,也就是说,当表含有聚集索引时,表中的数据行是会移动的,所以,RID是不能一直定位在同一行的。这个时候就需要通过聚集索引键来定位一行,这个聚集索引键就是键值书签。

下面我们可以通过例子来认识下书签查找,以及它们对性能的影响:

我们还用 SQL Server执行计划那些事儿(1)——哈希、合并、嵌套联接的选择中的例子(删除所有索引)。

1.我们先建立非聚集索引

create nonclustered index non_index_headers_buyDate on headers(BuyDate)

然后执行

select ID,BuyDate from Headers where BuyDate>'2008-12-28'

注:该例子仅仅为了说明情况,不含实际意义。

 分析:在不含聚集索引的表中,因为这个非聚集索引中没有覆盖ID列,所以要通过RID进行查找。

2.建立聚集索引

create clustered index index_headers_ID on headers(ID)

然后执行上面查询语句

select ID,BuyDate from Headers where BuyDate>'2008-12-28'

分析:是不是觉得很奇怪?不奇怪,因为非聚集索引的覆盖列包含,非聚集索引的键列、非聚集索引包含的列以及聚集索引的键列。因此,ID和BuyDate为非聚集索引覆盖列,所以仅通过索引页就可以查出结果,没必要再通过任何书签查找。

3.执行下面SQL语句

select ID,BuyDate,Discount from Headers where BuyDate>'2008-12-28'

分析:因为此时的表中有聚集索引,又因为非聚集索引没有覆盖Discount列,所以会引起键查找。

4.书签查找对查询性能的影响到底有多大呢 ?

创建非聚集索引,让其覆盖Discount列

create nonclustered index non_index_headers_buyDate_include on headers(BuyDate) include(Discount)

然后执行例子3中的查询语句

select ID,BuyDate,Discount from Headers where BuyDate>'2008-12-28'

 分析:因为此时非聚集索引已经覆盖了,查询列和结果列,故没有书签查找。另外,此时逻辑读取次数已经明显比之前小了很多,可见书签查找是很耗资源的,甚至会使索引失效,从而引起全表扫描。

 

总结

1.只有在用到非聚集索引查找时,并且查找列和返回列没有完全被索引覆盖时,才会引起书签查找。

2.书签查找是非常耗费资源的,甚至会使索引失效。

3.可以通过让非聚集索引覆盖查询列和返回列来消除书签查找。

 

转载于:https://www.cnblogs.com/mrzl/p/4105703.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一百零九期:双十一光棍节调试一个商城必备功能,Java Springboot开源秒杀系统

秒杀系统在电商系统中是非常重要的,不是因为秒杀这个功能重要,而是因为秒杀提现的是一个系统的并发负载能力。例如阿里巴巴或者京东,每年的双十一的峰值,其实就是下一年的常态,双十一各项技术指标,已经作为…

【名额有限】云开发AI拓展能力等你来体验!

这次来了个超厉害的新能力! 人脸智能打马赛克、人脸智能裁剪……各种操作,都能一步到位! 迫不及待想体验,戳链接:https://wj.qq.com/s2/3986990/e0ef/ 还没有搞懂,继续往下看—— 基于云开发+AI人脸检测与分…

第一百一十期:详解SpringBoot应用跨域访问解决方案

说到跨域访问,必须先解释一个名词:同源策略。所谓同源策略就是在浏览器端出于安全考量,向服务端发起请求必须满足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。 …

spring mvc学习(23):eclipse创建Maven项目没有src/main/java并不能新建的问题

eclipse里第一次创建Maven项目时,src/main/java与src/test/java目录都不会出现,这是因为eclipse里的一个默认配置。这两个目录是真实存在的,只是隐藏了。 这时候想要让这两个目录出现,就需要修改以下配置: 右击项目-…

spring mvc学习(24):配置maven环境和创建maven项目(建议收藏,超全超详细)

1本次歌谣就对如何创建一个maven项目做一个详细的讲解,毕竟卡了我三天,久久不能入眠,也搜了网上很多的博客 都没有顺利的解决maven项目的创建。这篇建议大家收藏,总会用到的。不然大家看网上的博客也是一脸懵逼。 2首先工具使用…

Torque2D MIT 实战记录: 塔防进度(1)

前言 Torque2D虽然工具不齐全,而且加入MIT不久,但是有老底在,所以即使是第一版也是非常好用和完善的,这几天准备开发一款塔防类的游戏. :) 熟悉了TorqueScript的用法后,写东西还是很快的. 进度 1. 完成了道具库模块 2. 场景系统 3. 阵营逻辑 4. 攻击系统雏形 截图 效果还不错吧…

第一百一十一期:思考 | 一文说透秒杀系统如何设计

秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可…

第一百一十二期:96秒100亿!如何抗住双11高并发流量?

今年双 11 全民购物狂欢节进入第十一个年头,1 分 36 秒,交易额冲到 100 亿 !比 2018 年快了近 30 秒,比 2017 年快了近 1 分半!这个速度再次刷新天猫双 11 成交总额破 100 亿的纪录。 作者:邴越 今年双 11 全民购物狂欢节进入第…

第一百一十三期:去伪存真,区块链应用到底能解决什么实际问题?

区块链技术仍然在发展初期,实践应用也停留在试水阶段。就金融等领域而言,区块链究竟意味着什么?今后实践应用的前景何在?在Libra的倒逼下,全球央行数字货币又将如何发展? 作者:第一财经 两周前,区块链成为热词。上…

两种战斗

两种战斗 Written by Allen Lee 战斗分两种,我们一定要把它们分开,就是为了维持生命的战斗,和为了维持自尊的战斗。 如果你无法分清的话,要么你将致使他失去生命。要么你将致使他失去自尊。“你要是现在去帮忙的话,或…

地图图元的闪烁效果制作

实现查找之后如果加上一个闪烁效果会更明显,方法是用个时间控件控制,改变vstyle即可;还可以简单的设置进程休眠时间,改变可视性,利用一个循环,控制闪烁次数。前面一种实现代码如下: 用个时间控件…

790. Domino and Tromino Tiling

文章目录1 题目理解2 动态规划2.1只有一种板2.2 有两种板1 题目理解 We have two types of tiles: a 2x1 domino shape, and an “L” tromino shape. These shapes may be rotated. XX <- domino XX <- “L” tromino X Given N, how many ways are there to tile a …

第一百一十四期:盘点十大最新Web UI测试工具

本文为您盘点目前十大最新Web UI测试工具的各自优缺点&#xff0c;以方便您根据实际情况进行选择。 作者&#xff1a;陈峻 在过去的几年中&#xff0c;业界至少出现了十二种全新的UI测试自动化工具。虽然每一种工具都有各自的侧重点&#xff0c;但是它们普遍将出色的可用性和…

通过Web Services上传和下载图片文件

通过Web Services上传和下载图片文件 随着Internet技术的发展和跨平台需求的日益增加&#xff0c;Web Services的应用越来越广&#xff0c;我们不但需要通过Web Services传递字符串信息&#xff0c;而且需要传递二进制文件信息。下面&#xff0c;我就分别介绍如何通过Web Servi…

第一百一十五期:Web开发必须掌握的三个技术:Token、Cookie、Session

在Web应用中&#xff0c;HTTP请求是无状态的。即&#xff1a;用户第一次发起请求&#xff0c;与服务器建立连接并登录成功后&#xff0c;为了避免每次打开一个页面都需要登录一下&#xff0c;就出现了cookie&#xff0c;Session。 作者&#xff1a;一颗小梪梪 在Web应用中&am…

第一百一十六期:不能错过!你必须知道的3种重要Python技能

学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否过早地开始使用程序库了呢&#xff1f;这也许是因为你还没有意识到pure python的魅力。 作者&#xff1a;读芯术 学习Pandas是很棒的体验&#xff0c;学习Numpy也很有趣。但是&#xff0c;你是否…

第一百一十七期:爱上 Go 语言的10个理由

这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 作者&#xff1a;4bytes 这个月 Go 语言就将迎来它的10岁生日了&#xff0c;于是我们特地列出了10条让你可以开心使用 Go 语言的理由。 Map 集合/映射默认使用0值 …

第一百一十八期:运行 JavaScript 代码片段的 20 种工具

运行 JavaScript 代码片段的 20 种工具 前端日常开发中&#xff0c;我们使用喜爱的 IDE 调试 JavaScript 代码&#xff0c;比如我喜欢的代码编辑器有两个&#xff0c;Sublime Text 3 和 VS Code&#xff0c;前几年还使用过 Atom&#xff0c;偶尔我们会遇到临时需要快速分享给同…

spring mvc学习(25):Eclipse设置代码自动提示

Eclipse只需几步简单的设置就可以像idea那样代码自动提示了&#xff0c;喜欢的小伙伴可以赶紧动手设置&#xff0c;提升效率。 第一步&#xff1a;打开Eclipse --> Window --> Preferences 第二步&#xff1a;点击Java --> 打开Editor --> 点击Content Assist 第…

spring mvc学习(26):处理数据模型--从表单到controller传输数据

创建maven项目就不说了&#xff0c;需要的找我前面的博客 pom.xml文件 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http…