Non sicuro perché pensi che lo scenario 2 "logicamente" sia more efficient
. Su un INNER JOIN
, tutto è fondamentalmente un filtro, quindi SQL Server può comprimere la logica con la stessa esatta forma del piano sottostante. Ecco un esempio da AdventureWorks2012 (click to enlarge):
ho preferiscono separare il join criteri dai criteri di filtro, quindi sarà sempre scrivere la query nel formato a sinistra. Tuttavia @HLGEM è un buon punto, queste clausole sono intercambiabili in questo caso solo perché è un INNER JOIN
. Per un OUTER JOIN
, è molto importante posizionare i filtri sul tavolo esterno nei criteri di join, altrimenti si finisce involontariamente con un INNER JOIN
e si modifica drasticamente la semantica della query. Quindi il mio consiglio su come il piano può essere collassato vale solo per i join interiori.
Se sei preoccupato per le prestazioni, inizierei con lo sblocco di SELECT *
e tirando solo le colonne effettivamente necessarie (e assicurandoti che ci sia un indice di copertura).
Quattro mesi più tardi, è emersa un'altra risposta affermando che di solito ci sarà una differenza nelle prestazioni e che mettere i criteri di filtro nella clausola ON
sarà migliore. Mentre non discuterò che è certamente plausibile che ciò possa accadere, ritengo che non sia certamente la norma e non dovrebbe essere qualcosa che usi come scusa per inserire sempre tutti i criteri di filtro nella clausola ON
.
fonte
2013-04-02 21:45:26
I piani di esecuzione devono essere identici. – MarcinJuraszek
Perché senza la conoscenza del modo in cui SQL interpreta le query, sembra che filtrare il set da unire prima di unirsi sarebbe più efficiente di unire tutto e quindi filtrare. Marcin ha ragione, hanno lo stesso piano di esecuzione. Non avevo familiarità con l'utilizzo di piani di esecuzione - fanno bene il lavoro. –
Probabilmente il titolo dovrebbe essere cambiato per dire esplicitamente "inner join" in quanto è ben accettato che per i join esterni i piani di esecuzione spesso varino. – crokusek