SQL Server计划:索引扫描/索引查找之间的区别


Answers:


128

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

索引查找是SQL Server使用索引的b树结构直接查找匹配记录的方法(有关其工作原理的信息,请参见http://mattfleming.com/node/192)-花费的时间仅与匹配记录的数量。

  • 通常,索引查找比索引扫描更可取(匹配的记录数通常比记录总数少得多),因为执行索引查找所需的时间是恒定的,而与您的记录总数无关表。
  • 但是请注意,在某些情况下,索引扫描可能比索引查找更快(有时明显更快)-通常在表非常小或大部分记录与谓词匹配时。

3
链接仍然有效吗?对我来说,它不起作用。如果有更新的链接,请提供帮助
Ronak Agrawal

2
@RonakAgrawal看起来链接实际上已经死了-也许改为查看Wikipedia
贾斯汀


76

遵循的基本规则是:扫描效果不好,搜索效果很好。

索引扫描

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

索引搜寻

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


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

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

参考文献

有关SQL Server执行计划中每个运算符的详细信息,请参阅...。


7

简短答案:

  • 索引扫描:触摸除某些列以外的所有行。

  • 搜索索引:触摸某些行和某些列。


4

使用索引扫描时,将扫描索引中的所有行以找到匹配的行。这对于小型表可能是有效的。使用“索引查找”,只需触摸实际满足条件的行,因此通常性能更高


2

当索引定义无法在单行上找到满足搜索谓词的条件时,将发生索引扫描。在这种情况下,SQL Server必须扫描多个页面以找到满足搜索谓词的行范围

对于“索引查找”,SQL Server使用索引定义查找与搜索谓词匹配的单个行。

索引搜索更好,更有效。


0

扫描会触及表中的每一行,即使您追求的是或不行

查找仅查看您要查找的行。

搜索总是比扫描更好,因为它们在查找数据的方式上效率更高。

一个很好的解释可以在这里找到


3
搜索并不总是更好,例如,如果表相对较小,并且该表中很大比例的行需要返回,那么索引扫描可能会变得更加高效。
贾斯汀

1
贾斯汀,您好,我想您想说表扫描有时会更好。除非我们谈论集群,否则索引搜索总是比索引扫描更好。但是,有时由于您提到的原因,表扫描或聚簇索引扫描可能会更有效。有时,ms sql会使用该表,即使该索引具有criteria字段也不会使用该索引来获取表中没有的索引。
Jose
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.