首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server计划:索引扫描/索引查找之间的差异

SQL Server计划:索引扫描/索引查找之间的差异
EN

Stack Overflow用户
提问于 2009-07-16 09:47:40
回答 6查看 95.4K关注 0票数 91

在SQL Server执行计划中,索引扫描和索引查找有什么不同

我使用的是SQL Server 2005。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-16 10:07:29

索引扫描是SQL server读取整个索引以查找匹配项的地方-这所需的时间与索引的大小成正比。

索引查找是指SQL server使用索引的b树结构直接查找匹配的记录(有关其工作原理的信息,请参阅http://mattfleming.com/node/192 )所用的时间仅与匹配记录的数量成正比。

  • 通常,索引查找比索引扫描更可取(当匹配记录的数量比记录总数少得多时),因为无论表中记录的总数是多少,执行索引查找所需的时间都是恒定的。
  • 请注意,在某些情况下,索引扫描可能比索引查找快(有时会快得多)-通常在表很小时,或者当大部分记录与谓词匹配时。
票数 136
EN

Stack Overflow用户

发布于 2009-07-16 10:23:30

要遵循的基本规则是扫描不好,搜索好。

索引扫描

当SQL Server执行扫描时,它会将要从磁盘读取的对象加载到内存中,然后从上到下读取该对象,查找所需的记录。

索引Seek

当SQL Server执行查找时,它知道数据将在索引中的什么位置,因此它从磁盘加载索引,直接转到它需要的索引部分,并读取到它需要的数据结束的位置。这显然是一个比扫描更有效的操作,因为SQL已经知道它要查找的数据位于何处。

如何修改执行计划以使用查找而不是扫描?

当SQL Server查找您的数据时,可能使SQL Server从查找切换到扫描的最大原因之一是,当您要查找的某些列未包含在您希望它使用的索引中时。大多数情况下,这将使SQL Server回退到执行聚集索引扫描,因为聚集索引包含表中的所有列。这是(至少在我看来)我们现在能够在索引中包含列,而无需将这些列添加到索引的索引列的最大原因之一。通过在索引中包含额外的列,我们增加了索引的大小,但我们允许SQL Server读取索引,而不必返回到聚集索引或表本身来获取这些值。

参考

有关SQL Server执行计划中这些运算符中每个运算符的具体信息,请参阅...

Online

票数 78
EN

Stack Overflow用户

发布于 2017-07-22 21:42:08

简短回答:

  • 索引扫描:触摸除某些列之外的所有行。
  • 索引搜索:触摸某些行和某些列。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1136524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档