Ist es besser, Variablen mit SET oder SELECT zu füllen?

8

Was ist der bessere Weg (in Bezug auf die Leistung), um einen Wert auf variabel zu setzen?

  1. Auf SETBefehl:

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

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;
    
Gadonski
quelle
1
Die Verwendung von SELECT ist nicht semantisch, aber ich bin gespannt, ob es schneller als SET ist.
Rafael Kassner
1
Sie können in diese aussehen soll stackoverflow.com/questions/189588/...
SQL Learner
@RafaelKassner - SELECTist schneller, wenn mehreren Variablen gleichzeitig Werte zugewiesen werden . Ansonsten ist der Leistungsunterschied vernachlässigbar.
Nick Chammas
@SQLLearner - Dieser Bericht liefert nicht schlüssige Ergebnisse. Zuerst gibt das Poster an, dass SETes schneller ist, dann fügt er auf halber Strecke hinzu: "Seltsamerweise SETbeginnt das hinterherzuhinken , wenn Sie die Anzahl der Läufe auf 10 erhöhen."
Nick Chammas

Antworten:

8

Wählen Sie das eine oder andere nicht ausschließlich für die Leistung aus.

Wählen Sie basierend auf Ihren Stil- und Entwicklungsanforderungen, wie in der Schlussfolgerung zu diesem hervorragenden Vergleich zwischen SELECTundSET (Hervorhebung und geringfügige Formatierung hinzugefügt) empfohlen wird :

Best Practice empfiehlt, sich nicht an eine Methode zu halten. Je nach Szenario können Sie beide verwenden möchten SEToder SELECT.

Es folgen einige Szenarien für die Verwendung SET:

  • Wenn Sie der Variablen einen einzelnen Wert direkt zuweisen müssen und keine Abfrage zum Abrufen des Werts erforderlich ist
  • NULL-Zuweisungen werden erwartet ( NULLin Ergebnismenge zurückgegeben)
  • Für jede geplante Migration sollen Standards eingehalten werden
  • Nicht skalare Ergebnisse werden erwartet und müssen behandelt werden

Die Verwendung SELECTist in den folgenden Fällen effizient und flexibel:

  • Mehrere Variablen werden durch direkte Zuweisung von Werten gefüllt
  • Mehrere Variablen werden von einer einzigen Quelle (Tabelle, Ansicht) ausgefüllt.
  • Weniger Codierung für die Zuweisung mehrerer Variablen
  • Verwenden Sie diese Option, wenn Sie brauchen , um @@ROWCOUNTund @ERRORfür letzte Anweisung ausgeführt
Nick Chammas
quelle
3

Ich denke, der Konsens ist, dass es einen vernachlässigbaren Leistungsunterschied zwischen den beiden gibt (mit SETschneller sein). Aber wenn Sie wie ich sind, würde ich SETgegebenenfalls aus Gründen der Lesbarkeit verwenden. Der nächste Typ, der Ihren Code pflegt, wird es Ihnen danken ;-)

MarlonRibunal
quelle
1
Können Sie Benchmarks veröffentlichen, die beweisen, dass SET schneller ist?
AK
Alex, bitte sehen Sie sich dies als Beispiel an stackoverflow.com/questions/189588/…
MarlonRibunal
Marlon, dieser Bericht liefert nicht schlüssige Ergebnisse. Beachten Sie, dass auf halber Höhe des Posters Folgendes vermerkt ist: "Seltsamerweise bleibt das SET zurück, wenn Sie die Anzahl der Läufe auf 10 erhöhen."
Nick Chammas
Das ist der Grund, warum meine Antwort zu "Lesbarkeitszwecken" tendiert. Das Anwendungsszenario in Ihrer Antwort sind wichtige Punkte.
MarlonRibunal
2

Ich verwende immer SET, es sei denn, ich fülle mehrere Variablen aus der Ergebnismenge einer Abfrage aus. Auf diese Weise fragen wir mit SELECT die Tabelle nur einmal ab.

Vince Pergolizzi
quelle