¿Qué hace OPTION FAST en la instrucción SELECT?

29

He profundizado en lo que hace la OPTION (FAST XXX)sugerencia de consulta dentro de una SELECTdeclaración y todavía estoy confundido al respecto. De acuerdo con MSDN:

Especifica que la consulta está optimizada para la recuperación rápida de los primeros número_camas. Este es un entero no negativo. Después de que se devuelven los primeros números_cadena, la consulta continúa la ejecución y produce su conjunto de resultados completo.

Para mí eso no tiene mucho sentido, pero ¿básicamente la consulta puede obtener las primeras XXX filas realmente rápido y luego el resto a la velocidad normal?

La consulta de Microsoft Dynamics que me hizo pensar en esto es:

select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like  '%'
order by project OPTION(FAST 500)

¿Alguien puede explicar exactamente qué está haciendo esta sugerencia de consulta y es una ventaja sobre no usarla?

Matthew Verstraete
fuente

Respuestas:

24

A FAST Nle indicará a SQL Server que genere un plan de ejecución que devuelva rápidamente el número de filas definidas como N.

Tenga en cuenta que las estimaciones serán las mismas Nya que le está diciendo al servidor SQL que recupere las Nfilas lo más rápido posible.

por ejemplo, ejecutando debajo de la consulta con 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 filas reales con option (fast 500)

ingrese la descripción de la imagen aquí

Est vs filas reales sin option (fast 500)

ingrese la descripción de la imagen aquí

Un caso de uso sería cuando una aplicación está haciendo almacenamiento en caché (carga una gran cantidad de datos en segundo plano) y quiere mostrar al usuario una porción de datos lo más rápido posible.

Otro caso de uso interesante es en el terreno de SSIS que Rob Farley describe FAST Ncomo un catalizador que acelera la recuperación de datos.

Al agregar esta pista, se sintió como si se hubiera movido una varita mágica a través de la consulta, para que se ejecutara varias veces más rápido.

Ver también la respuesta de Remus Rusanu .

Kin Shah
fuente
11

Cuando utiliza esta sugerencia de consulta OPTION (FAST n), el optimizador elige un plan de ejecución que puede devolver esa cantidad de registros de la manera más rápida posible. Normalmente, el optimizador intenta decidir sobre una ruta que pueda devolver eficientemente el conjunto de resultados completo. Entonces, si desea que un conjunto de filas regrese rápidamente, podría usar esto para recuperarlas, pero en la mayoría de los casos, usar esta sugerencia hará que el conjunto de resultados completo regrese más lento en lugar de permitir que el optimizador use un plan para hacer asi que.

Solo para elaborar un caso de uso: es posible que tenga dos tablas bastante grandes que necesita unir, pero sabe que hay un conjunto de datos más pequeño con el que necesita trabajar de una de ellas. En este caso, usar FAST sobre una tabla más grande sin tener que crear índices / gastos generales adicionales podría ayudar en lugar de permitir que SQL cree una tabla hash gigante en segundo plano.

codedawg82
fuente
2

Me encontré con la misma pregunta hace un par de años cuando investigaba problemas de rendimiento en Dynamics AX. Siguiendo la explicación de Microsoft, pude ver un plan de ejecución diferente activado por la pista y esto corresponde a las otras respuestas dadas aquí.

Con la sugerencia, SQL Server intenta encontrar un plan de ejecución que permita una especie de transmisión de resultados, ya que salen de un bucle anidado, por ejemplo, en lugar de un plan de ejecución que requiere que todos los registros sean leídos (y potencialmente ordenados) antes siendo salida.

El único problema en mi caso es que el servidor SQL siempre tardó (numerosos) minutos en devolver los resultados al usar la sugerencia, mientras que la consulta devolvió los resultados (todo el conjunto de resultados) en cuestión de segundos sin la sugerencia ... no exactamente qué era de esperarse. Personalmente, usaría esta sugerencia con gran precaución, y no sistemáticamente en todas las formas, como en nuestro entorno Dynamics (bueno, ya no más).

Entonces, para responder al OP: como muchas sugerencias, no necesariamente ayuda a mejorar la consulta como se supone que debe hacer (así que ... ¡prueba, prueba, prueba!)

Nelson 2.0
fuente