SELECT语句中的OPTION FAST有什么作用?


29

我对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)

谁能确切解释这个查询提示在做什么,这是不使用它的好处?

Answers:


24

A FAST N将告诉SQL Server生成执行计划,并快速返回定义为的行数N

请注意,N由于您要告诉sql server尽快检索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)

估算与实际行 option (fast 500)

在此处输入图片说明

估算值与实际值(不含) option (fast 500)

在此处输入图片说明

一个用例是当应用程序正在执行缓存(在后台加载大量数据)并希望向用户显示尽快的数据切片时。

Rob FarleySSIS领域中的另一个有趣用例FAST N用作加速数据检索的催化剂。

通过添加此提示,感觉就像在查询中挥舞着魔杖一样,使其运行速度提高了数倍。

也请参阅Remus Rusanu的答案


11

当您使用此查询提示OPTION(FAST n)时,优化器将选择一个执行计划,该计划可以以最快的方式返回该记录量。通常,优化器会尝试确定可以有效返回完整结果集的路径。因此,如果您希望快速返回一组行,则可以使用它来检索它们,但是在大多数情况下,使用该提示会使完整的结果集返回的速度较慢,而不是让优化器使用计划来完成所以。

只是为了详细说明一个用例:您可能需要将两个相当大的表连接在一起,但是您知道只有一个较小的数据集需要处理。在这种情况下,对较大的表使用FAST而不需要创建其他索引/开销可能会有所帮助,而不是让SQL在后台创建巨型哈希表。


2

几年前,当我在Dynamics AX中研究性能问题时,我偶然发现了一个相同的问题。按照Microsoft的解释,我可以看到提示触发了不同的执行计划,这与此处给出的其他答案相对应。

有了这个提示,SQL Server尝试找到一种执行计划,该执行计划允许某种类型的结果流(例如从嵌套循环中出来的结果),而不是一种执行计划,该执行计划要求在读取所有记录(并可能对其进行排序之前)正在输出。

在我的情况下,唯一的问题是,使用提示时,SQL Server总是花费(大量)分钟来返回结果,而在没有提示的情况下,查询只需几秒钟就返回了结果(整个结果集)。是预期的。我会非常谨慎地亲自使用此提示,而不是像在Dynamics环境中那样系统地使用所有形式的提示(好了,不再使用)。

因此,要回答OP:像许多提示一样,它并不一定像应该做的那样有助于改善查询(因此...测试,测试,测试!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.