O que OPTION FAST na instrução SELECT faz?

29

Eu fiz algumas pesquisas sobre o que a OPTION (FAST XXX)dica de consulta faz dentro de uma SELECTinstrução e ainda estou confuso. De acordo com o MSDN:

Especifica que a consulta é otimizada para recuperação rápida do primeiro número_rows. Este é um número inteiro não negativo. Depois que os primeiros number_rows são retornados, a consulta continua a execução e produz seu conjunto de resultados completo.

Para mim, isso não faz muito sentido, mas basicamente a consulta pode obter as primeiras linhas XXX muito rápido e o restante na velocidade normal?

A consulta do Microsoft Dynamics que me fez pensar sobre isso é:

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

Alguém pode explicar exatamente o que essa dica de consulta está fazendo e sua vantagem em não usá-la?

Matthew Verstraete
fonte

Respostas:

24

A FAST Ninstruirá o SQL Server a gerar um plano de execução retornando rapidamente o número de linhas definidas como N.

Observe que as estimativas serão as seguintes, Npois você está dizendo ao servidor sql para recuperar Nlinhas o mais rápido possível.

por exemplo, executando a consulta abaixo com 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)

Linhas Est vs Reais com option (fast 500)

insira a descrição da imagem aqui

Linhas Est vs Reais sem option (fast 500)

insira a descrição da imagem aqui

Um caso de uso seria quando um aplicativo está fazendo cache (carrega grande quantidade de dados em segundo plano) e deseja mostrar ao usuário uma fatia de dados o mais rápido possível.

Outro caso de uso interessante está no terreno do SSIS que Rob Farley descreve FAST Ncomo usar como um catalisador que acelera a recuperação de dados.

Ao adicionar essa dica, parecia que uma varinha mágica havia sido acenada pela consulta, para fazê-la funcionar várias vezes mais rápido.

Veja a resposta de Remus Rusanu também .

Kin Shah
fonte
11

Quando você usa essa dica de consulta OPTION (FAST n), o otimizador escolhe um plano de execução que pode retornar essa quantidade de registros da maneira mais rápida possível. Normalmente, o otimizador tenta decidir um caminho que possa retornar com eficiência o conjunto de resultados completo. Portanto, se você deseja que um conjunto de linhas retorne rapidamente, é possível usá-lo para recuperá-las, mas na maioria dos casos, usar essa dica fará com que o conjunto completo de resultados volte mais lento do que o otimizador use um plano para fazer isso. então.

Apenas para elaborar um caso de uso: você pode ter duas tabelas bastante grandes que precisam ser reunidas, mas sabe que há apenas um conjunto menor de dados com os quais você precisa trabalhar em uma delas. Nesse caso, o uso do FAST em uma tabela maior sem a necessidade de criar índices / sobrecarga adicionais pode ajudar, em vez de permitir que o SQL crie uma tabela de hash gigante em segundo plano.

codedawg82
fonte
2

Eu me deparei com a mesma pergunta há alguns anos atrás ao investigar problemas de desempenho no Dynamics AX. Seguindo a explicação da Microsoft, pude ver um plano de execução diferente acionado pela dica e isso corresponde às outras respostas fornecidas aqui.

Com a dica, o SQL Server tenta encontrar um plano de execução que permita uma espécie de fluxo de resultados, pois eles saem de um loop aninhado, por exemplo, em vez de um plano de execução que exige que todos os registros sejam lidos (e potencialmente classificados) antes sendo produzido.

O único problema no meu caso é que o servidor SQL sempre levou (numerosos) minutos para retornar os resultados ao usar a dica, enquanto a consulta retornou resultados (todo o conjunto de resultados) em questão de segundos sem a dica ... não exatamente o que era esperado. Pessoalmente, eu usaria essa dica com muita cautela, e não sistematicamente em todas as formas, como em nosso ambiente Dynamics (bem, não mais).

Portanto, para responder ao OP: como muitas dicas, isso não ajuda necessariamente a melhorar a consulta como deveria (então ... teste, teste, teste!)

Nelson 2.0
fonte