É melhor preencher variáveis ​​usando SET ou SELECT?

8

Qual é a melhor maneira (com relação ao desempenho) para definir um valor como variável?

  1. Por SETcomando:

    DECLARE @VarString nvarchar(max);
    SET @VarString = 'john doe';
    SELECT @VarString;
  2. Por SELECTcomando:

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;
Gadonski
fonte
11
Usar SELECT não é semântico, mas estou curioso para saber se é mais rápido que SET.
Rafael Kassner
11
Você pode querer olhar para este stackoverflow.com/questions/189588/...
SQL Learner
@RafaelKassner - SELECTé mais rápido ao atribuir valores a várias variáveis ​​ao mesmo tempo . Caso contrário, a diferença de desempenho é insignificante.
Nick Chammas
@SQLLearner - Esse relatório fornece resultados inconclusivos. Primeiro, o pôster declara que SETé mais rápido; depois, na metade do caminho, ele acrescenta: "Estranhamente, se você aumentar o número de corridas para dizer 10, o número SETcomeça a ficar para trás".
Nick Chammas

Respostas:

8

Não escolha um ou outro estritamente para desempenho.

Escolha com base no que se adapta ao seu estilo e às necessidades de desenvolvimento, conforme recomendado na conclusão desta excelente comparação entre SELECTeSET (ênfase e menor formatação adicionada):

A melhor prática sugere não aderir a um método. Dependendo do cenário, você pode querer usar os dois SETou SELECT.

A seguir, são apresentados alguns cenários para o uso SET:

  • Se você precisar atribuir um único valor diretamente à variável e nenhuma consulta estiver envolvida para buscar o valor
  • Designações NULL são esperadas ( NULLretornadas no conjunto de resultados)
  • Os padrões devem ser seguidos para qualquer migração planejada
  • Resultados não escalares são esperados e devem ser tratados

O uso SELECTé eficiente e flexível nos seguintes casos:

  • Várias variáveis ​​estão sendo preenchidas atribuindo valores diretamente
  • Várias variáveis ​​estão sendo preenchidas por fonte única (tabela, exibição)
  • Menos codificação para atribuir várias variáveis
  • Use isso se você precisar obter @@ROWCOUNTe @ERRORpara a última instrução executada
Nick Chammas
fonte
3

Eu acho que o consenso é que há uma diferença insignificante de desempenho entre os dois ( SETsendo mais rápido). Mas se você é como eu, eu usaria SETonde apropriado para fins de legibilidade. O próximo cara que manterá seu código agradecerá por isso ;-)

MarlonRibunal
fonte
11
Você pode postar benchmarks comprovando que o SET é mais rápido?
AK
Alex, dê uma olhada nisso como um exemplo stackoverflow.com/questions/189588/…
MarlonRibunal 11/12
Marlon, esse relatório fornece resultados inconclusivos. Observe que na metade do cartaz observa que: "Estranhamente, se você aumentar o número de execuções para dizer 10, o SET começará a ficar para trás".
Nick Chammas
Essa é a razão pela qual minha resposta está inclinada para "fins de legibilidade". O cenário de caso de uso em sua resposta é um excelente ponto.
MarlonRibunal
2

Eu sempre uso SET, a menos que esteja preenchendo várias variáveis ​​do conjunto de resultados de 1 consulta. Dessa forma, usando SELECT, apenas consultamos a tabela uma vez.

Vince Pergolizzi
fonte