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.可以通过让非聚集索引覆盖查询列和返回列来消除书签查找。

时间: 2024-10-20 00:19:57

SQL Server执行计划那些事儿(3)——书签查找的相关文章

SQL Server执行计划那些事儿(2)——查找和扫描

接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. 开门见上,直接入题 在查看执行计划时候,你是否曾经也和我一样,有这样的疑惑呢?查找和扫描究竟是什么,以及他们的在查询性能上有什么区别.下面分享下我的理解. 扫描和查找是SQL Server从表或索引中读取数据所采用的迭代器,又因为经常在执行计划中看到,因此理解他们之间的区别,对我们优化查询有很重要的

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗? 3: 同一条SQL语句,其执行计划会变化,为什么 4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗? 5:同时存在几个索引,SQL语句会走那个索引? ..............................................

SQL Server执行计划的理解

原文:SQL Server执行计划的理解 要理解执行计划,怎么也得先理解,那各种各样的名词吧.鉴于自己还不是很了解.本文打算作为只写懂的,不懂的懂了才写. 在开头要先说明,第一次看执行计划要注意,SQL Server的执行计划是从右向左看的. 名词解析: 扫描:逐行遍历数据. 先建立一张表,并给大家看看大概是什么样子的. CREATE TABLE Person( Id int IDENTITY(1,1) NOT NULL, Name nvarchar(50) NULL, Age int NULL

sql server 执行计划(execution plan)介绍

sql server 执行计划(execution plan)介绍 大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是sql server 执行计划 sql server 执行计划的大致使用 学习计划 1.什么是sql server 执行计划 执行计划是查询优化器对我们提交的T-SQL查询请求的最有效方法的的执行结果,执行计划可以告诉我们查询是如何

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执

SQL Server 执行计划操作符详解(2)——串联(Concatenation )

本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的.其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连? 简介: 串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为"串联",在其他格式及英文版本中称为"Concatenation".

SQL Server 执行计划中的扫描方式举例说明

原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的语句,点击Ctrl+L执行 2.示例student表,id,name,addressid上建立聚集索引Name建索引address无索引 3.区别1. [Table Scan]:遍历整个表,查找所有匹配的记录行.这个操作将会一行一行的检查,当然,效率也是最差的.以无索引字段为条件,按存放顺序一个个查,where address='123' 2. [I

引用:初探Sql Server 执行计划及Sql查询优化

原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想整理下对MSSQL的一些理解与感悟,却一直没有心思和时间写,晚上无事便写了一篇探索MSSQL执行计划,本文讲执行计划但不仅限于讲执行计划. 网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出仅几S甚至几MS的时

SQL Server 执行计划解析

前置说明: 本文旨在通过一个简单的执行计划来引申并总结一些SQL Server数据库中的SQL优化的关键点,日常总结,其中的概念介绍中有不足之处有待补充修改,希望大神勘误. SQL语句如下: SELECT <所需列> --列太多,不一一列出 FROM study1 INNER JOIN series1 ON (study1.study_uid_id = series1.study_uid_id) --连接条件1 INNER JOIN image1 image1 ON (series1.seri