OPTION (FAST XXX)
查询提示在SELECT
语句内的作用做了一些挖掘,但仍然对此感到困惑。根据MSDN:指定为快速检索第一个number_rows优化查询。这是一个非负整数。返回第一个number_rows后,查询将继续执行并产生其完整结果集。对我来说,这没有多大意义,但基本上查询可以非常快地获得前XXX行然后其余部分以正常速度运行?
让我想到的Microsoft Dynamics查询是:
select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like '%'
order by project OPTION(FAST 500)
谁能确切解释这个查询提示正在执行,并且比不使用它有优势吗?
#1 楼
一个FAST N
会告诉SQL Server生成一个执行计划,并快速返回定义为N
的行数。请注意,由于您要告诉sql server检索
N
行,因此估算值将与N
相同。尽可能快。例如在
fast 500
下运行以下查询:-- total rows : 19972
SELECT [BusinessEntityID]
,[TotalPurchaseYTD]
,[DateFirstPurchase]
,[BirthDate]
,[MaritalStatus]
,[YearlyIncome]
,[Gender]
,[TotalChildren]
,[NumberChildrenAtHome]
,[Education]
,[Occupation]
,[HomeOwnerFlag]
,[NumberCarsOwned]
FROM [AdventureWorks2012].[Sales].[vPersonDemographics]
order by BusinessEntityID
option (fast 500)
Est vs实际行与
option (fast 500)
Est vs实际行没有
option (fast 500)
一个用例是当应用程序正在执行缓存(在后台加载大量数据)并希望向用户显示一部分数据时
另一个有趣的用例是在SSIS领域,Rob Farley描述了使用
FAST N
作为催化剂来加快数据检索。通过添加此提示,感觉就像在查询中挥舞着魔杖一样,使其运行速度提高了数倍。
也请参阅Remus Rusanu的答案。
#2 楼
当您使用此查询提示OPTION(FAST n)时,优化器将选择一个执行计划,该计划可以以最快的方式返回该记录量。通常,优化器尝试确定可以有效返回完整结果集的路径。因此,如果您希望快速返回一组行,则可以使用它来检索它们,但是在大多数情况下,使用该提示将使整个结果集返回的速度较慢,而不是让优化器使用计划来执行所以。只需详细说明一个用例:您可能需要将两个相当大的表连接在一起,但是您知道只有一个较小的数据集需要使用其中的一个他们。在这种情况下,对较大的表使用FAST而不需要创建其他索引/开销可能会有所帮助,而不是让SQL在后台创建巨型哈希表。
#3 楼
几年前,在调查Dynamics AX中的性能问题时,我偶然发现了一个相同的问题。按照Microsoft的解释,我可以看到提示触发了不同的执行计划,这与此处给出的其他答案相对应。借助提示,SQL Server尝试找到一种执行计划,该执行计划允许某种结果流,例如从嵌套循环中出来的结果,而不是要求所有记录都执行的执行计划。在输出之前必须先读取(并可能对其进行排序)。
我的唯一问题是,使用提示时,SQL Server总是花费(大量)分钟来返回结果,而查询返回的结果是(整个结果集)在几秒钟之内就没有任何提示……与预期的不完全相同。我会非常谨慎地亲自使用此提示,而不是像在Dynamics环境中那样系统地在所有形式上使用它(嗯,不再了)。
因此,要回答OP:像许多提示一样,它不会不一定能像预期的那样帮助改进查询(因此...测试,测试,测试!)