È meglio popolare le variabili usando SET o SELECT?


8

Qual è il modo migliore (per quanto riguarda le prestazioni) di impostare un valore su variabile?

  1. A SETcomando:

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

    DECLARE @VarString nvarchar(max);
    SELECT @VarString = 'john doe';
    SELECT @VarString;

1
L'uso di SELECT non è semantico, ma sono curioso di sapere se è più veloce di SET.
Rafael Kassner,

1
Potresti voler esaminare questo stackoverflow.com/questions/189588/…
SQL Learner

@RafaelKassner: SELECTè più veloce quando si assegnano valori a più variabili contemporaneamente . Altrimenti, la differenza di prestazioni è trascurabile.
Nick Chammas,

@SQLLearner - Quel rapporto dà risultati inconcludenti. In primo luogo il poster afferma che SETè più veloce, poi a metà strada aggiunge: "Stranamente, se si fa girare il numero di piste fino a dire, 10, SETinizia a rimanere indietro".
Nick Chammas,

Risposte:


8

Non scegliere l'uno o l'altro rigorosamente per le prestazioni.

Scegli in base a ciò che si adatta al tuo stile e alle tue esigenze di sviluppo, come indicato nella conclusione di questo eccellente confronto tra SELECTeSET (enfasi e minore formattazione aggiunta):

Le migliori pratiche suggeriscono di non attenersi a un metodo. A seconda dello scenario, potresti voler utilizzare entrambi SETo SELECT.

Di seguito sono riportati alcuni scenari per l'utilizzo SET:

  • Se è necessario assegnare un singolo valore direttamente alla variabile e non è richiesta alcuna query per recuperare il valore
  • Sono previsti compiti NULL ( NULLrestituiti nel set di risultati)
  • Gli standard devono essere seguiti per qualsiasi migrazione pianificata
  • Sono previsti risultati non scalari che devono essere gestiti

L'uso SELECTè efficiente e flessibile nei seguenti casi:

  • Più variabili vengono popolate assegnando direttamente i valori
  • Più variabili vengono popolate da un'unica fonte (tabella, vista)
  • Meno codifica per l'assegnazione di più variabili
  • Utilizzare questo se è necessario ottenere @@ROWCOUNTe @ERRORper l'ultima istruzione eseguita

3

Penso che il consenso sia che c'è una differenza di prestazioni trascurabile tra i due (con l' SETessere più veloce). Ma se sei come me, userei SETdove appropriato per scopi di leggibilità. Il prossimo che manterrà il tuo codice ti ringrazierà per questo ;-)


1
Puoi pubblicare benchmark che dimostrano che SET è più veloce?
AK,

Alex, si prega di dare un'occhiata a questo come esempio stackoverflow.com/questions/189588/...
MarlonRibunal

Marlon, quel rapporto dà risultati inconcludenti. Si noti che a metà del poster si nota che: "Stranamente, se si fa girare il numero di run up per dire, 10, il SET inizia a rimanere indietro".
Nick Chammas,

Questo è il motivo per cui la mia risposta è orientata verso "scopi di leggibilità". Lo scenario d'uso nella tua risposta è un ottimo punto.
MarlonRibunal,

2

Uso sempre SET a meno che non stia popolando più variabili dal set di risultati di 1 query. In questo modo, usando SELEZIONA eseguiamo una query sulla tabella una sola volta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.