Est-il préférable de remplir des variables à l'aide de SET ou SELECT?

8

Quelle est la meilleure façon (en ce qui concerne les performances) de définir une valeur sur variable?

  1. Par SETcommande:

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

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;
Gadonski
la source
1
Utiliser SELECT n'est pas sémantique, mais je suis curieux de savoir s'il est plus rapide que SET.
Rafael Kassner
1
Vous voudrez peut-être examiner ce stackoverflow.com/questions/189588/…
SQL Learner
@RafaelKassner - SELECTest plus rapide lors de l' attribution de valeurs à plusieurs variables à la fois . Sinon, la différence de performances est négligeable.
Nick Chammas
@SQLLearner - Ce rapport donne des résultats non concluants. D'abord, l'affiche indique que SETc'est plus rapide, puis à mi-chemin, il ajoute: "Curieusement, si vous augmentez le nombre de courses pour dire, 10, le SETcommence à prendre du retard."
Nick Chammas

Réponses:

8

Ne choisissez pas l'un ou l'autre strictement pour la performance.

Choisissez en fonction de ce qui convient à votre style et à vos besoins de développement, comme indiqué dans la conclusion de cette excellente comparaison entre SELECTetSET (accentuation et mise en forme mineures ajoutées):

Les meilleures pratiques suggèrent de ne pas s'en tenir à une seule méthode. Selon le scénario, vous pouvez utiliser les deux SETou SELECT.

Voici quelques scénarios d'utilisation SET:

  • Si vous devez affecter une seule valeur directement à une variable et qu'aucune requête n'est impliquée pour récupérer la valeur
  • Des affectations NULL sont attendues ( NULLretournées dans le jeu de résultats)
  • Les normes sont censées être suivies pour toute migration planifiée
  • Des résultats non scalaires sont attendus et doivent être traités

L'utilisation SELECTest efficace et flexible dans les quelques cas suivants:

  • Plusieurs variables sont remplies en affectant directement des valeurs
  • Plusieurs variables sont remplies par une seule source (table, vue)
  • Moins de codage pour affecter plusieurs variables
  • Utilisez-le si vous avez besoin d'obtenir @@ROWCOUNTet @ERRORd'exécuter la dernière instruction
Nick Chammas
la source
3

Je pense que le consensus est qu'il y a une différence de performance négligeable entre les deux (avec SETêtre plus rapide). Mais si vous êtes comme moi, j'utiliserais le SETcas échéant à des fins de lisibilité. Le prochain gars qui maintiendra votre code vous en remerciera ;-)

MarlonRibunal
la source
1
Pouvez-vous publier des benchmarks prouvant que SET est plus rapide?
AK
Alex, veuillez jeter un œil à ceci comme exemple stackoverflow.com/questions/189588/…
MarlonRibunal
Marlon, ce rapport donne des résultats peu concluants. Notez qu'à mi-chemin de l'affiche, il est noté que: "Bizarrement, si vous augmentez le nombre de courses pour dire 10, le SET commence à prendre du retard."
Nick Chammas
C'est la raison pour laquelle ma réponse penche vers "des fins de lisibilité". Les scénarios d'utilisation dans votre réponse sont d'excellents points.
MarlonRibunal
2

J'utilise toujours SET sauf si je remplis plusieurs variables à partir du jeu de résultats de 1 requête. De cette façon, en utilisant SELECT, nous ne questionnons la table qu'une seule fois.

Vince Pergolizzi
la source