¿Es mejor llenar variables usando SET o SELECT?

8

¿Cuál es la mejor manera (con respecto al rendimiento) para establecer un valor en variable?

  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
fuente
1
Usar SELECT no es semántico, pero tengo curiosidad por saber si es más rápido que SET.
Rafael Kassner
1
Es posible que desee ver este stackoverflow.com/questions/189588/…
SQL Learner
@RafaelKassner: SELECTes más rápido al asignar valores a múltiples variables a la vez . De lo contrario, la diferencia de rendimiento es insignificante.
Nick Chammas
@SQLLearner: ese informe proporciona resultados no concluyentes. Primero, el cartel dice que SETes más rápido, luego a mitad de camino agrega: "Curiosamente, si subes el número de carreras para decir, 10, SETcomienza a quedarse atrás".
Nick Chammas

Respuestas:

8

No elija uno u otro estrictamente por su rendimiento.

Elija según lo que se adapte a sus necesidades de estilo y desarrollo, como se recomienda en la conclusión de esta excelente comparación entre SELECTySET (énfasis y formato menor agregado):

La mejor práctica sugiere no apegarse a un método. Dependiendo del escenario, es posible que desee utilizar ambos SETo SELECT.

Los siguientes son algunos escenarios para usar SET:

  • Si debe asignar un único valor directamente a la variable y no se realiza ninguna consulta para obtener el valor
  • Se esperan asignaciones NULL ( NULLdevueltas en el conjunto de resultados)
  • Los estándares deben seguirse para cualquier migración planificada
  • Se esperan resultados no escalares y se deben manejar

El uso SELECTes eficiente y flexible en los siguientes casos:

  • Se están llenando múltiples variables asignando valores directamente
  • Múltiples variables están siendo pobladas por una sola fuente (tabla, vista)
  • Menos codificación para asignar múltiples variables
  • Use esto si necesita obtener @@ROWCOUNTy @ERRORpara la última declaración ejecutada
Nick Chammas
fuente
3

Creo que el consenso es que hay una diferencia de rendimiento insignificante entre los dos (con SETser más rápido). Pero si eres como yo, lo usaría SETdonde sea apropiado para fines de legibilidad. El próximo tipo que mantendrá tu código te lo agradecerá ;-)

MarlonRibunal
fuente
1
¿Puedes publicar puntos de referencia que demuestren que SET es más rápido?
AK
Alex, por favor mira esto como un ejemplo stackoverflow.com/questions/189588/…
MarlonR tribunal
Marlon, ese informe da resultados no concluyentes. Tenga en cuenta que a la mitad del cartel se observa que: "Curiosamente, si aumenta el número de carreras para decir, 10, el SET comienza a quedarse atrás".
Nick Chammas
Esa es la razón por la cual mi respuesta se inclina hacia los "propósitos de legibilidad". El escenario de caso de uso en su respuesta son grandes puntos.
MarlonRriage
2

Siempre uso SET a menos que esté completando múltiples variables del conjunto de resultados de 1 consulta. De esa manera, al usar SELECT solo consultamos la tabla una vez.

Vince Pergolizzi
fuente