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,一经查实,立即删除!

相关文章

博客堂怎么连个搜索功能都没有

今天想去博客堂搜索下文章看看,结果找了半天,差点把显示器翻过来看也没找到个搜索的功能。是我真的没找到,还是博客堂觉的搜索功能没必要啊??? 转载于:https://www.cnblogs.com/BearsTaR/archive/2006/06/07/419837.html

1218. 最长定差子序列

文章目录1 题目理解2 开始思考1 题目理解 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。 输入:整数数组arr, 整数difference 输出&…

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

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

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

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

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

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

【REPERTOIRE】Rastaman Vibration

上周四的晚上跟项目里的同事一起去吃饭,去的是城外面一个叫Aussonne小镇上的Restaurant du Lac,左近真的有个湖。 当晚又充分体现了法国人吃晚饭的功夫,我们到凌晨一点才回城,接下来的几天昏昏沉沉,用了周末才恢复&…

63. Unique Paths II and 64. Minimum Path Sum

文章目录1 63 Unique Paths II1.1 题目描述1.2 动态规划解决2 64. Minimum Path Sum2.1 题目理解2.2 动态规划这一遍刷dp的题目就很轻松了。1 63 Unique Paths II 1.1 题目描述 A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram…

LCA模板(数剖实现)

题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题。 思路:今天开始学树剖,先拿lca练练。树剖解lca,两次dfs复杂度均为O(n),每次查询为logn,因此总复杂度为:O(2…

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

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

Servlet技术简介与编写、编译Servlet程序

1.Servlet技术简介Servlet技术是Sun公司提供的一种实现动态网页的解决方案,它是基于Java编程语言的WEB服务器端编程技术,主要用于在WEB服务器端获得客户端的访问请求信息和动态生成对客户端的响应消息。Servlet技术也是JSP技术(另…

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

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

120. Triangle

文章目录1 题目理解2 解题2.1 动态规划2.2 优化空间2.3进一步优化空间1 题目理解 Given a triangle array, return the minimum path sum from top to bottom. For each step, you may move to an adjacent number on the row below. 输入&#xff1a;一个三角形数组List<…

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

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

三十岁前不要去在乎的18件事

1&#xff0e;放弃 把握的反面就是放弃&#xff0c;选择了一个机会&#xff0c;就等于放弃了其它所有的可能。当新的机会摆在面前的时候&#xff0c;敢于放弃已经获得的一切&#xff0c;这不是功亏一篑&#xff0c;这不是半途而废&#xff0c;这是为了谋求更大的发展空间&#…

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

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

TcpClient.Connect函数连接超时的问题(转载)

TcpClient.Connect函数连接超时的问题 问题原述&#xff1a; http://topic.csdn.net/t/20060616/15/4825920.html 调用TcpClient.Connect函数连接其他机器。我在一台机器上测试程序&#xff0c;对于连接根本无法连接&#xff08;物理连接不通&#xff09;的机器&#xff0c;该函…

Programming MS Office 2000 Web Components第二章第一节(第二部分)

排序和过滤 阅读本节时&#xff0c;如果您打开随书光盘Samples\Chap02目录下的SortFilterExample.htm文件。您会发现这个例子很有用。本节展示的代码和描述的特定环境来自这个文件。 电子表格组件支持Excel中的基础的排序和过滤功能&#xff0c;并且通过编程模型和用户界面来提…

309. Best Time to Buy and Sell Stock with Cooldown

1 题目理解 Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple tim…

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

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

不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

Python爬虫为什么受欢迎如果你仔细观察&#xff0c;就不难发现&#xff0c;懂爬虫、学习爬虫的人越来越多&#xff0c;一方面&#xff0c;互联网可以获取的数据越来越多&#xff0c;另一方面&#xff0c;像 Python这样的编程语言提供越来越多的优秀工具&#xff0c;让爬虫变得简…