Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

EXCEPT viene eseguito più velocemente di un JOIN quando le colonne della tabella sono le stesse

Nessuno può dirti che EXCEPT supererà sempre o mai un OUTER JOIN equivalente . L'ottimizzatore sceglierà un piano di esecuzione appropriato indipendentemente da come scrivi il tuo intento.

Detto questo, ecco la mia linea guida:

Usa EXCEPT quando almeno uno di quanto segue è vero:

  1. La query è più leggibile (questo sarà quasi sempre vero).
  2. Le prestazioni sono migliorate.

E ENTRAMBE di quanto segue sono vere:

  1. La query produce risultati semanticamente identici e puoi dimostrarlo attraverso test di regressione sufficienti, inclusi tutti i casi limite.
  2. Le prestazioni non sono ridotte (di nuovo, in tutti i casi limite, così come le modifiche ambientali come la cancellazione del pool di buffer, l'aggiornamento delle statistiche, la cancellazione della cache dei piani e il riavvio del servizio).

È importante notare che può essere difficile scrivere un EXCEPT equivalente interrogare come JOIN diventa più complesso e/o ti affidi a duplicati in parte delle colonne ma non in altre. Scrivere un NOT EXISTS equivalente, mentre leggermente meno leggibile di EXCEPT dovrebbe essere molto più banale da realizzare e spesso porterà a un piano migliore (ma nota che non direi mai ALWAYS o NEVER , tranne nel modo in cui l'ho appena fatto).

In questo post del blog mostro almeno un caso in cui EXCEPT è superato da entrambi un LEFT OUTER JOIN correttamente costruito e ovviamente da un equivalente NOT EXISTS variazione.