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