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:
- La query è più leggibile (questo sarà quasi sempre vero).
- Le prestazioni sono migliorate.
E ENTRAMBE di quanto segue sono vere:
- La query produce risultati semanticamente identici e puoi dimostrarlo attraverso test di regressione sufficienti, inclusi tutti i casi limite.
- 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.