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;

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

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 ;-)


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.