sql,server,清除执行计划.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
sql,server,清除执行计划   【如何使用SQLServer执行计划】   【看懂SQLServer执行计划】   【SQLServer执行计划各个动作含义】   【理解SQLServer执行计划的意思】   要理解执行计划,怎么也得先理解,那各种各样的名词吧。鉴于自己还不是很了解。本文打算作为只写懂的,不懂的懂了才写。   在开头要先说明,第一次看执行计划要注意,SQLServer的执行计划是从右向左看的。名词解析:   扫描:逐行遍历数据。   先建立一张表,并给大家看看大概是什么样子的。   CREATETABLEPerson(   IdintIDENTITY(1,1)NOTNULL,   Namenvarchar(50)NULL,   AgeintNULL,   HeightintNULL,   Areanvarchar(50)NULL,   MarryHistorynvarchar(10)NULL,   EducationalBackgroundnvarchar(10)NULL,   Addressnvarchar(50)NULL,   InSiteIdintNULL   )ON[PRIMARY]   表中的数据14万左右,大概类似下面这样:   此表,暂时没有任何索引。   一、数据访问操作   1、表扫描   表扫描:发生于堆表,并且没有可用的索引可用时,会发生表扫描,表示整个表扫描一次。现在,我们来对此表执行一条简单的查询语句:   SELECT*FromPersonWHEREName=公子   查看执行计划如下:   表扫描,顾名思义就是整张表扫描,找到你所需要的数据了。   2、聚集索引扫描   聚集索引扫描:发生于聚集表,也相当于全表扫描操作,但在针对聚集列的条件如(WHEREId   10)等操作时,效率会较好。   下面我们在Id列来对此表加上一个聚集索引   CREATECLUSTEREDINDEXIX_IdONPerson(Id)   再次执行同样的查询语句:   SELECT*FromPersonWHEREName=公子   执行计划如下:   为什么建的聚集索引在Id列,会对扫描有影响呢?更何况与Name条件也没关系啊?   其实,你加了聚集索引之后,表就由堆表变成了聚集表。我们知道聚集表的数据存在于聚集索引的叶级节点。因此,聚集扫描与表扫描其实差别不大,要说差别大,也得看where条件里是什么,以后返回的数据。就本条SQL语句而言,效率差别并不大。   可以看看I/O统计信息:   表扫描:   聚集索引扫描:   此处超出本文范畴了,效率不在本文考虑范围内,本文只考虑的是,各种扫描的区别,以及为何会产生。   3、聚集索引查找   聚集索引查找:扫描聚集索引中特定范围的行。   看执行以下SQL语句:   SELECT*FROMPersonWHEREId=73164   执行计划如下:   4、索引扫描   索引扫描:整体扫描非聚集索引。   下面我们来添加一个聚集索引,并执行一条查询语句:   CREATENONCLUSTEREDINDEXIX_NameONPerson(Name)--创建非聚集索引   SELECTNameFROMPerson   查看执行计划如下:   为什么此处会选择索引扫描(非聚集索引)呢?因为此非聚集索引能够覆盖所需要的数据。如果非聚集索引不能覆盖呢?例如,我们将SELECT改为SELECT*再来看看。   好明显,返回结果所包括的记录太多,用非聚集索引反而不合算。因此使用了聚集索引。如果此时我们删除聚集索引,再执行SELECT*看看。   DROPINDEX_Id   而此时没有聚集索引,所以只有使用表扫描。5、书签查找   前面关于索引的学习我们已经知道,当在非聚集索引中并非覆盖和包含所需全部的列时,SQLServer会选择,直接进行聚集索引扫描获得数据,还是先去非聚集索引找到聚集索引键,然后利用聚集索引找到数据。   下面来看一个书签查找的示例:   SELECT*FROMPersonWHEREName=胖胖--Name列有非聚集索引   执行计划如下:   上面的过程可以理解为:首先通过非聚集索引找到所求的行,但这个索引并不包含所有的列,因此还要额外去基本表中找到这些列,因此要进行键查找,如果基本表是以堆进行组织的,那么这个键查找(KeyLookup)就会变成RID查找(RIDLookup),键查找和RID查找统称为书签查找。不过有时当非聚集索引返回的行数过多时,SQLServer可能会选择直接进行聚集索引扫描了。   ?TableScan(表扫描):如果看到这个信息,就说明数据表上没有聚集索引,或者查询优化器   没有使用索引来查找。意即资

文档评论(0)

sanshengyuan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档