O link de Joe é um bom ponto de partida. Quassnoi cobre isso também.
Em geral, se seus campos estão indexados corretamente OU se você espera filtrar mais registros (ou seja, tem muitas linhas
EXIST
na subconsulta) NOT EXISTS
terá um desempenho melhor. EXISTS
e NOT EXISTS
ambos em curto-circuito - assim que um registro corresponde aos critérios, ele é incluído ou filtrado e o otimizador passa para o próximo registro. LEFT JOIN
se juntará a TODOS OS REGISTROS independentemente de corresponderem ou não, filtre todos os registros não correspondentes. Se suas tabelas forem grandes e/ou você tiver vários JOIN
critérios, isso pode ser muito, muito intensivo em recursos. Eu normalmente tento usar
NOT EXISTS
e EXISTS
onde possível. Para SQL Server, IN
e NOT IN
são semanticamente equivalentes e podem ser mais fáceis de escrever. Esses estão entre os únicos operadores que você encontrará no SQL Server com garantia de curto-circuito.