在 SQL Server 执行计划中,索引扫描(Index Scan)和索引查找(Index Seek)有什么区别?
我使用的是 SQL Server 2005。
在 SQL Server 执行计划中,索引扫描(Index Scan)和索引查找(Index Seek)有什么区别?
我使用的是 SQL Server 2005。
索引扫描是 SQL 服务器读取整个索引以查找匹配项的过程——这需要的时间与索引大小成比例。
索引搜索是 SQL 服务器使用索引的 B-Tree 结构直接搜索匹配记录的过程(有关其工作原理的想法,请参见http://mattfleming.com/node/192)- 所需时间仅与匹配记录数成比例。
遵循的基本规则是扫描(Scans)不好,搜索(Seeks)比较好。
索引扫描(Index Scan)
当SQL Server进行扫描时,它会将要读取的对象从磁盘加载到内存中,然后从上到下遍历该对象,寻找所需的记录。
索引搜索(Index Seek)
当SQL Server进行搜索时,它知道数据在索引中的位置,因此它从磁盘加载索引,直接转到所需的索引部分,并读取所需数据结束的位置。这显然比扫描更有效率,因为SQL已经知道所需数据的位置。
如何修改执行计划以使用搜索而不是扫描?
当SQL Server查找数据时,最可能导致其从搜索切换到扫描的最大因素之一是您要查找的某些列未包含在您想要使用的索引中。大多数情况下,这会导致SQL Server回退到执行聚集索引扫描,因为聚集索引包含表中的所有列。这是我们现在能够在索引中包含列但不将这些列添加到索引列中的原因之一(至少是我的个人意见)。通过在索引中包含附加列,我们增加了索引的大小,但是允许SQL Server读取索引,而无需返回到聚集索引或表本身来获取这些值。
参考资料
有关SQL Server执行计划中每个操作符的具体信息,请参见....
简短回答:
索引扫描:访问所有行,但仅涉及某些列。
索引查找:访问特定行和特定列。
使用索引扫描时,需要扫描索引中的所有行以查找匹配的行。对于小表而言,这可能是有效的。 使用索引查找时,只需操作实际符合条件的行,因此通常更高效。
当索引定义无法找到单行以满足搜索谓词时,会发生索引扫描。在这种情况下,SQL Server必须扫描多个页面以查找满足搜索谓词的行范围。
对于索引搜索,SQL Server使用索引定义查找匹配搜索谓词的单个行。
索引搜索更好,更有效。