在SQL Server的执行计划是什么索引扫描和索引的区别寻求
我是SQL Server 2005上。
在SQL Server的执行计划是什么索引扫描和索引的区别寻求
我是SQL Server 2005上。
索引扫描就是SQL服务器读取索引中查找匹配的整体 - 这需要的时间是成正比的索引的大小。
索引查找就是SQL服务器使用索引的B树结构,直接寻求匹配的记录(见http://mattfleming.com/node/192一个想法就如何工作) -所用的时间只有成正比匹配的记录数。
基本的规则,遵循的是扫描是坏的,寻求良好。
索引扫描
当SQL Server不会加载它想从磁盘读入内存中的对象的扫描,然后通过自上而下寻找它需要的记录中对象读取。
索引查找
当SQL Server将一个寻求它知道在哪里,该数据将是指数,所以从磁盘加载了索引,直接进入指数的一部分,它需要和读取到的数据,它需要两端。 这显然比扫描一个更有效的操作,如SQL已经知道在哪里找数据的位置。
如何修改使用寻求代替扫描的执行计划?
当SQL Server正在为您的数据可能是最大的事情,这将使SQL Server的开关从寻求一个扫描时,一些列的你在找不包含在你想让它使用索引之一。 大多数情况下,这将具有SQL Server回落到做一个聚集索引扫描,因为聚集索引包含表中的所有列。 这是最大的原因(在我看来至少),我们现在必须包含在索引中的列的能力之一,而不会增加这些列的索引的索引列。 通过包含在索引中的附加列,我们增加了索引的大小,但是我们允许SQL Server读取索引,而不必多哥回聚簇索引,或者表中它的自我得到这些值。
参考
有关在SQL Server执行计划中的这些运算符的具体信息,请参阅....
聚集索引扫描-图书在线
聚集索引寻求-图书
线上
索引扫描:
由于扫描触摸表中的每一行,它是否符合要求,成本是成正比的表中的行的总数。 因此,扫描是一种高效的策略,如果该表是小或者如果大部分的行晋级谓词。
索引查找:
由于只寻求倒是有资格的行和包含这些合格的行页面,成本成正比,符合条件的行和页的数量,而不是表中的行的总数。
索引扫描是什么,但扫描从第一页的数据页到最后一页。 如果在表上的索引,并且如果查询正在触摸数据量较大,这意味着该查询检索超过50%或90%的数据,然后优化器将只扫描所有的数据页检索数据行。 如果没有索引,那么你可能会看到一个表扫描(索引扫描)的执行计划。
索引搜索通常优选用于高选择性查询。 这也就意味着,该查询只是请求行的数量较少,或只是检索等10个(一些文件说,15%)的表行。
一般查询优化器试图使用索引查找,这意味着优化器已经找到检索记录集一个有用的指标。 但是,如果因为没有索引或在表上没有有用的索引是不能够这样做要么,则SQL Server必须扫描所有满足查询条件的记录。
扫描和寻求什么区别?
的扫描返回整个表或索引。 甲寻求有效地从基于谓词的索引的一个或多个范围返回行。 例如,考虑以下查询:
select OrderDate from Orders where OrderKey = 2
扫描
随着扫描,我们读到的订单表的每一行,计算谓词“里OrderKey = 2”,如果谓词是真(即,如果该行资格),返回行。 在这种情况下,我们指的是谓语“残余”谓词。 为了最大限度地提高性能,只要有可能,我们评估在扫描剩余谓词。 但是,如果谓词是太贵了,我们可以在一个单独的过滤迭代器对其进行评估。 剩余的谓词出现在WHERE关键字或与标签XML执行计划的文本显示计划。
下面是使用扫描此查询的文本显示计划(略编辑为简洁起见):
| - 表扫描(OBJECT:([指令]),其中:([ORDERKEY] =(2)))
下图说明了扫描:
由于扫描倒是在它是否有资格表的每一行,成本是成正比的表中的行的总数。 因此,扫描是一种高效的策略,如果该表是小或者如果大部分的行晋级谓词。 但是,如果表很大,如果大多数的行不符合条件,我们接触更多的页面和行,并执行更多的I / O比是必要的。
寻求
回过头来看看这个例子,如果我们有OrderKey索引,寻求可能是一个更好的计划。 随着寻找,我们使用索引来直接导航到那些满足谓词的行。 在这种情况下,我们指的是谓语为“寻求”谓词。 在大多数情况下,我们并不需要重新评估寻求谓词作为残留谓词; 该指数可以确保只寻求返回合格行。 在寻求谓词出现在使用搜索关键字或与标签XML执行计划的文本显示计划。
下面是使用寻求相同的查询文本显示计划:
| -index寻求(OBJECT:([订单] [OKEY_IDX]),SEEK:([ORDERKEY] =(2))ORDERED FORWARD)。
下图说明了求:
由于只寻求倒是有资格的行和包含这些合格的行页面,成本成正比,符合条件的行和页的数量,而不是表中的行的总数。 因此,寻求一般是一种更有效的策略,如果我们有高度选择性寻求谓语; 也就是说,如果我们有一个寻求谓词,消除了表的一大部分。
有关显示计划的注意事项
在显示计划,我们区分在扫描之间,并寻求以及对堆扫描(无索引的对象),聚簇索引,以及非聚集索引之间。 下表列出了所有的有效组合:
https://blogs.msdn.microsoft.com/craigfr/tag/scans-and-seeks/
简短的回答:
索引扫描:触摸的所有行,但某些列。
索引查找:触摸某些行和某些列。
索引扫描,索引中的所有行进行扫描,以查找匹配的行。 这可以有效的小桌子。 随着索引查找,只需要触摸实际上符合条件的行,因此通常是更好的性能
索引扫描时会发生索引定义不能在同一行上找到满足搜索谓词。 在这种情况下,SQL Server必须扫描多页找到一系列满足搜索谓词的行。
在指数的情况下寻求,SQL Server找到一个匹配的行使用索引定义搜索谓词。
指数寻求更好,更有效。
的扫描触及表中的每一行,即使它你是什么后或不
的扫描只查看那些你在找什么行。
寻求总是最好有比扫描,因为它们是在它看起来数据向上的方式更有效。
一个很好的解释可以发现这里