在 SQL Server 执行计划中,索引扫描和索引搜索有什么区别
我在 SQL Server 2005 上。
索引扫描是 SQL 服务器读取整个索引以查找匹配项的地方 - 这花费的时间与索引的大小成正比。
索引查找是 SQL 服务器使用索引的 b 树结构直接查找匹配记录的地方(有关其工作原理的想法,请参见http://mattfleming.com/node/192) - 所用时间仅与匹配记录的数量。
要遵循的基本规则是扫描是坏的,搜索是好的。
索引扫描
当 SQL Server 进行扫描时,它将要从磁盘读取的对象加载到内存中,然后从上到下读取该对象以查找所需的记录。
索引搜索
当 SQL Server 进行查找时,它知道数据将在索引中的位置,因此它从磁盘加载索引,直接进入它需要的索引部分并读取它需要的数据结束的位置. 这显然是比扫描更有效的操作,因为 SQL 已经知道它要查找的数据的位置。
如何修改执行计划以使用 Seek 而不是 Scan?
当 SQL Server 正在查找您的数据时,可能会使 SQL Server 从查找切换到扫描的最大事情之一就是您要查找的某些列未包含在您希望它使用的索引中。大多数情况下,这会使 SQL Server 回退到执行聚集索引扫描,因为聚集索引包含表中的所有列。这是我们现在能够在索引中包含列的最大原因之一(至少在我看来),而无需将这些列添加到索引的索引列中。通过在索引中包含额外的列,我们增加了索引的大小,但是我们允许 SQL Server 读取索引,而不必返回到聚集索引或它自己的表来获取这些值。
参考
有关 SQL Server 执行计划中每个运算符的详细信息,请参阅....
简短的回答:
索引扫描:触摸除某些列之外的所有行。
索引搜索:触摸某些行和某些列。
使用索引扫描,将扫描索引中的所有行以找到匹配的行。这对于小表可能很有效。使用 Index Seek,它只需要触及实际满足条件的行,因此通常性能更高
当索引定义无法在单行上找到满足搜索谓词时,就会发生索引扫描。在这种情况下,SQL Server 必须扫描多个页面以找到满足搜索谓词的行范围。
在索引查找的情况下,SQL Server 使用索引定义查找与搜索谓词匹配的单行。
索引搜索更好、更有效。