Wil*_*ver 6 sql sql-server query-hints
我正在阅读有关查询提示的文档:http: //msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspx
并注意到这一点:FAST number_rows指定优化查询以快速检索第一个number_rows.这是一个非负整数.返回第一个number_rows后,查询继续执行并生成其完整结果集.
所以,当我正在进行如下查询:
Select Name from Students where ID = 444
Run Code Online (Sandbox Code Playgroud)
我应该打扰这样的提示吗?假设SQL Server 2005,我应该什么时候?
- 编辑 -
在限制结果时也应该打扰一下:
Select top 10 * from Students OPTION (FAST 10)
Run Code Online (Sandbox Code Playgroud)
Rem*_*anu 20
FAST提示仅适用于复杂查询,其中优化程序可以选择多种替代方法.对于像您的示例这样的简单查询,它对任何事情没有帮助,查询优化器将立即确定存在一个简单的计划(在ID索引中查找,如果没有覆盖则查找名称)以满足查询并去寻找它.即使ID上没有索引,该计划仍然是微不足道的(可能是集群扫描).
举一个FAST有用的例子,考虑A和B之间的连接,并使用ORDER BY约束.首先评估连接B和嵌套循环A遵循ORDER BY约束,因此将产生快速结果(不需要SORT),但由于基数(B有许多与WHERE匹配的记录,而A很少),因此成本更高.另一方面,首先评估B和嵌套循环A将生成一个查询,该查询执行的IO更少,因此总体上更快,但结果必须先排序,SORT只能在评估连接后开始,因此第一个结果将会到来很晚了.优化器通常会选择第二个计划,因为整体效率更高.FAST提示会导致优化器选择第一个计划,因为它可以更快地生成结果.
使用TOP x时,同时使用OPTION FAST x没有任何好处。查询优化器已经根据您要检索的行数做出决策。对于普通查询也是如此,例如从唯一索引查询特定值。
除此之外,当您知道结果数可能低于x时, OPTION FAST x可能会有所帮助,但查询优化器不会。当然,如果查询优化器为结果很少的复杂查询选择较差的路径,则您的统计信息可能需要更新。如果您对x猜错,查询可能最终会花费更长的时间——在给出提示时几乎总是存在风险。
上述语句尚未经过测试——所有查询可能需要同样长的时间才能完全执行,甚至更长。如果只有 8 行,那么快速获取前 10 行固然很好,但理论上查询仍然必须在完成之前完全执行。我认为的好处可能是存在的,因为查询执行采用不同的路径,期望更少的总记录,而实际上它确实试图更快地获得第一个x。这两种类型的优化可能不一致。