网络编程
位置:首页>> 网络编程>> 数据库>> Sql Server查询性能优化之不可小觑的书签查找介绍(3)

Sql Server查询性能优化之不可小觑的书签查找介绍(3)

 来源:asp之家 发布时间:2012-05-22 18:24:53 

标签:查询性能优化,书签查找,sql,server


使用覆盖索引避免书签查找

覆盖索引是指非聚集索引上的列(键列+包含列) + 聚集索引的键列包含了查询中用到的所有列,对于索引IX_UserName来说索引覆盖列就是(UserName,UserID)。若查询中只用到了索引所覆盖的列,那么只需扫描索引即可完成查询,若用到了索引覆盖范围以外的列就需要书签查找来获取数据,当这种查找发生次较多时就会导致索引失效从而导致表扫描,因为查询优化器是基于开销的优化器,当其发现使用非聚集索引引发的书签查找开销比表扫描开销还大时就会放弃使用索引,转向表扫描。

1.在UserName,Age列上重建索引IX_UserName,这时对于索引IX_UserName来说覆盖列变为(UserName,Age,UserID),再次执行上面的查询SQL可以发现查询计划已经发生变化 

代码如下:


drop index IX_UserName on Userscreate index IX_UserName on Users(UserName,Age)


我们可以看到查询2、查询3的书签查找已经消失,因为索引IX_UserName包含了查询中用到得所有列(UserID,UserName,Age),查询4因为选择返回所有列我们的索引没有包含Gender和CreateTime列,故还是会进行书签查找

这时索引IX_UserName结构表示如下


可见对于查询2、查询3仅仅通过索引IX_UserName既可以拿到需要的列UserName,Age,UserID,而对于查询4索引并没有全部覆盖还是需要进行书签查找

2.继续修改我们的索引IX_UserName,使用include包含非键列(键列就是索引上的列,非键列就是索引之外的列,对于include来说就是存放于非聚集索引叶子节点上的列,聚集索引的列也放在非聚集索引的叶子节点上) 

代码如下:


drop index IX_UserName on Userscreate index IX_UserName on Users(UserName,Age) include(Gender,CreateTime)



可以看到我们修改索引使用include包含了Gender,CreateTime后,索引IX_UserName达到了对数据表Users的所有列的全覆盖,这时候毫无疑问的查询2、查询3没有出现书签查找,查询4的书签查找也消失了。

此时索引IX_UserName 结构如下

索引IX_UserName已经达到了对Users表的全覆盖,对于我们的查询2、查询3、查询4来说,仅通过索引IX_UserName即可完成查询,不需要进行书签查找。

这时我们再来看一下这两个查询的开销及查询计划,可以看到不需要我们进行索引提示,查询优化器已经自动选择了我们的索引,逻辑读也降至了2次


select * from Users where UserName like 'ja%'select * from Users with(index(IX_UserName)) where UserName like 'ja%'

关于Include请参考 SQL Server 索引中include的魅力(具有包含性列的索引)

  这里说明下书签查找对查询性能有着较大的影响并且基本上不可避免,这并不意味着书签查找就是洪水猛兽,原来我们不是也不知道啥叫书签查找么,查询性能一样也不差,是吧,呵呵。书签查找也说明了为什么我们不推荐写sql时使用select *,也解释了为什么有时候我们的索引会失效,同时可以作为优化查询性能考虑的一个方面,在设计表和索引时尽量规避书签查找带来的负面影响,比如非聚集索引尽量选择高选择性的列即返回尽量少的行,需要大批量数据查询时尽量使用聚集索引等。  

  本文中为了便于演示仅仅使用了有几条数据的表,而且查询中为了使用索引都用了索引提示,实际开发中请不要使用索引提示,查询优化器大多数情况下会为我们生成最优(最优不代表开销最小,只要开销足够小即认为最优)的执行计划,索引结构里面用到得RowID也仅仅是为了演示虚构出来的,我们只要认为它是对于数据行的一个标识位就行了。

  此文旨在让我们认识书签查找并意识到书签查找的意义,从而对于索引失效原因有清晰的认识,更好的理解查询计划。

0
投稿

猜你喜欢

  • 在使用javascript编程时浏览器中经常会遇到的两个麻烦,下面提供两个函数解决方式做参考,并提供一个demo让你更直观地了解我所说的这两
  •  几个月来好像就现在暂时无需求,稍微轻松一下,然后在Q群中发现有人提问,怎么用CSS实现数学公式“四又二分之一”。对于这个公式个人
  • ERROR 2003:Can't connect to MySQL server on 'localhost' (1
  • 前提条件:1.安装好Wampserver64(版本不限)2.Wampserver64软件启动后 变为绿色如:3.在数据库里面创建好名为&am
  • 保持良好的代码风格是每个Coder必学的课程,同样在HTML设计的时候也要特别注意代码的规范性,虽然说不规范的代码不会直接造成严重的后果,但
  • 段落已经讲完了,那么一些基本的应用方式也讲了一些,那么是否已经应用了呢?当然应用可以更为丰富,那么这些就需要自己在实际工作中不断的摸索与思考
  • 即将上线的百度C2C平台百度“有啊”开始对百度HI用户进行邀请,其首页页面、“有啊”LOGO也首次曝光。从曝光的图片看,百度“有啊”的主色调
  • 我想让一片文章,每到3000字就分到下一条插入到数据库,求高手  <%Dim Content Conte
  • 如果你是个赛车手,并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是什么感觉呢?MySQL数据库为开发人员所做的就好像是按按
  • 如何避免磁盘临时表因为内存储引擎不支持TEXT和BLOB数据类型, 使用到BLOB和TEXT列的查询和使用隐式临时表的查询将不得不使用MyI
  • 内连接(inner join)。 外连接: 全连接(full join)、左连接(left join)、右连接(right join)。 交
  • 客户用的数据库是mysql,而研发好的产品支持oracle,为了让客户掏腰包,我们必须把数据库环境从oracle转向mysql。我们在转换的
  • 晚上突然间看到大猫的头像在闪动,速度打开一看,发现他问,以前我写button标签的时候有没有写type属性,老实的我只有诚实地告诉他,我没写
  • 先来看看Global.asax文件代码:<script language="VB" runat
  • 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHO
  • 大家是否还记得1983年任天堂的著名游戏《超级玛丽》里那个留着胡子的意大利水管工人,还有日本konami公司1987年发行的射击游戏《魂斗罗
  • HTML5 越来越引起人们的关注,苹果甚至将 HTML5 视为 Flash 的掘墓人 。然而,作为一种尚未成型的技术,HTML5 对很多人来
  • 可以实现,下面我们就来做一个检测一个字符串在另一个字符串当中出现几次的函数:入口参数:TheChar="要检测的字符串"
  • --sql语句就用下面的存储过程 /*--数据导出Excel导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不
  • 沟通的时候,一般我不主动说自己是做用户体验设计,也不说做以用户为中心的设计,包括UED, UCD。这种专业名词传达的太虚,你也许是名用户体验
手机版 网络编程 asp之家 www.aspxhome.com