我已经对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:像许多提示一样,它不会不一定能像预期的那样帮助改进查询(因此...测试,测试,测试!)