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

Mat*_*ete 34 sql-server hints t-sql microsoft-dynamics

我已经对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)
Run Code Online (Sandbox Code Playgroud)

谁能准确解释这个查询提示在做什么以及它比不使用它的优势?

Kin*_*hah 29

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

请注意,N由于您告诉 sql serverN尽可能快地检索行,因此估计值将按照。

例如在查询下运行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)
Run Code Online (Sandbox Code Playgroud)

估计与实际行 option (fast 500)

在此处输入图片说明

估计与实际行没有 option (fast 500)

在此处输入图片说明

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

另一个有趣的用例是在SSIS 领域,Rob Farley将其描述FAST N为加速数据检索的催化剂。

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

另请参阅Remus Rusanu 的回答


cod*_*g82 14

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

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