SQL SERVER书签查找
SQL SERVER书签查找
SQL SERVER书签查找一、SQL SERVER书签查找定义
当查询优化器使用非聚集索引进行查找时,如果所选择的列或查询条件中的列只部分包含在使用的非聚集索引和聚集索引中时,就需要一个查找(lookup)来检索其他字段来满足请求。对一个有聚簇索引的表来说是一个键查找(key lookup),对一个堆表来说是一个RID查找(RID lookup),这种查找即是——书签查找(bookmark lookup)。
简单的说就是当你使用的sql查询条件和select返回的列没有完全包含在索引列中时就会发生书签查找。
二、SQL SERVER书签查找实例
1、表结构
其中 有一个 聚簇索引 PK_UserID 和一个 非聚簇索引IX_UserName。
2、执行如下SQL 语句
select UserName,Gender from dbo.UserInfo where UserName='userN600'
按上面的 SQL 产生执行计划 可以看出, 会产生一个书签查找(Key Lookup),如下图
2、如果需要增加逻辑读操作或者开销较大的物理读操作使书签查找的数据检索操作开销相当大,这个开销因素是非聚集索引更适合于返回较小的数据行数的原因。随着查询检索的行数增加,书签查找的开销将变得无法接受。
3、为了理解书签查找随着检索行数增加而使feu聚集索引无效,下面来看一个实例:
在Person表的ID(以1递增)上建索引,我们来看看下面两个查询的执行计划
(1)、返回100条
(2)、返回300条
我们看到,当要求返回300条数据的时候,SQL Server就不在使用Id列上的非聚集索引,而是直接进行表扫描了。因为SQL Server认为执行300次书签查找还不如直接对一张1万条记录的表进行全表扫描。
4、由上面的实例可以得出结论,返回大的结果集将增加书签查找的开销,甚至低于表扫描。因此在返回较大结果集的情况下,必须考虑避免书签查找的可能性。
四、避免书签查找的方法
1、使用聚集索引
对于聚集索引,索引的叶子页面和表的数据页面相同。因此,当读取聚集索引键列的值时,数据引擎可以读取其他列的值而不需要任何导航。例如前面的区间数据查询的操作,SQL Server通过B树结构进行查找是非常快速的。
把非聚集索引转换为一个聚集索引说起来很简单。但是,这个例子和大部分可能遇到的情况下,这不可能做到,因为表已经有了一个聚集索引。这个表的聚集索引恰好是主键。必须卸载掉所有的外键约束,卸载并且重建为一个非聚集索引。这不仅要考虑所涉及的工作,还可能严重地影响依赖于现有聚集索引的其他查询。
2、使用覆盖索引
例如
select id,name from persontenthousand where id <100
我们可以在 id,name上面建个组合索引,这样,由于非聚集索引上已经有了需要查询的Id和Name列的数据,所以不在需要书签查找定位到基本表。
3、使用索引连接
如果覆盖索引变得非常宽,那么可能要考虑索引连接技术。索引连接技术使用两个或更多索引之间的一个索引交叉来完全覆盖一个查询。因为索引连接技术需要访问多余一个索引,它必须在所有索引连接中使用的索引上执行逻辑读。因此,索引连接需要比覆盖索引更高的逻辑读数量。但是,因为索引连接所用的多个窄索引能够比宽的覆盖索引服务更多的查询。所以索引连接也可以作为避免书签查找的一种技术来考虑。
上面的例子我们创建了两个非聚集索引,一个在 Id列,一个在Name列。但是我们的查询需要同时返回Id列和Name列。而这两个非聚集索引都不完全包含要返回列。这个时候,哈希匹配目的就是通过定位到索引,而不用定位到基本表就能够获得我们所需要的全部数据,这样索引连接就避免了书签查找。
- sqlserver实例全库备份(sql server通过脚本进行数据库压缩全备份的方法推荐)
- sqlserver2000显示无服务器(SQL SERVER 2000 9003错误的解决方法只适用于SQL2000)
- SQL Server中raiserror
- 安装SQL Server 2016出错提示:需要安装oracle JRE7 更新 51(64位)或更高版本问题的解(安装SQL Server 2016出错提示:需要安装oracle JRE7 更新 5164位或更高版本问题的解)
- sql server 2000数据库管理(SQL Server 2000/2005/2008删除或压缩数据库日志的方法)
- sql server删除曾经登录过的登录名
- sqlserver存储过程同步数据(SQL Server存储过程同时返回分页结果集和总数)
- sql中row的用法(sql server数据库中raiserror函数用法的详细介绍)
- sqlserver自增字段(SQL Server中identity自增的用法详解)
- sqlserver语句显示表字段(SQL Server查找表名或列名中包含空格的表和列实例代码)
- sqlserver2012知识点(SQL Server 2012 安全概述)
- Sql Server 更新锁(UPDLOCK)
- Sql Server事务日志
- SQL SERVER中根据身份证号获取出生日期
- sql server中策略管理
- sqlserver2016使用教程(SQL Server 2016 Alwayson新增功能图文详解)
- 男人犯的错,为什么要女人来承担(为什么要女人来承担)
- 心理学 四个金蟾,哪个最招财 测你今生的运势有多棒(心理学四个金蟾)
- 吉善缘《聚宝金蟾》金蟾招财摆件 三足全铜蟾蜍客厅店铺开业礼品(吉善缘聚宝金蟾金蟾招财摆件)
- 招财化煞神兽,金蟾变了(招财化煞神兽金蟾变了)
- 26岁杨紫的白素贞遇上24岁鞠婧祎,哪个最美(26岁杨紫的白素贞遇上24岁鞠婧祎)
- 鞠婧祎和杨紫两种风格的女生,你心里谁比较美(鞠婧祎和杨紫两种风格的女生)
热门推荐
- 手机网站设计的几个建议
- python编写的小程序(几个适合python初学者的简单小程序,看完受益匪浅!推荐)
- css 三级层级菜单(利用CSS3实现动态的二级三级菜单效果实例源码)
- dedecms替换条件(织梦cmsDEDECMS通过正则批量查找替换数据库的自定义内容)
- 织梦添加模板(解决织梦安装模板时提示不能安装的问题)
- sql常见的聚合函数有哪些(SQL中的开窗函数详解可代替聚合函数使用)
- mysql实验总结分析(MySQL查询截取的深入分析)
- net微服务架构部署方式(基于Apache的支持.NET2.0的Web服务器搭建)
- 云服务器是属于什么类型的服务(什么是真正的云服务器?云服务器优势盘点)
- linuxread指令(Linux read命令的使用)