Não há como alguém lhe dizer que
EXCEPT
sempre ou nunca superará um OUTER JOIN
equivalente . O otimizador escolherá um plano de execução apropriado, independentemente de como você escreve sua intenção. Dito isso, segue minha orientação:
Use
EXCEPT
quando pelo menos um das seguintes é verdadeira:- A consulta é mais legível (isso quase sempre será verdade).
- O desempenho foi aprimorado.
E AMBOS das seguintes são verdadeiras:
- A consulta produz resultados semanticamente idênticos, e você pode demonstrar isso por meio de testes de regressão suficientes, incluindo todos os casos extremos.
- O desempenho não é prejudicado (novamente, em todos os casos extremos, bem como alterações ambientais, como limpeza do pool de buffers, atualização de estatísticas, limpeza do cache do plano e reinicialização do serviço).
É importante notar que pode ser um desafio escrever um equivalente
EXCEPT
consulta como o JOIN
torna-se mais complexo e/ou você está contando com duplicatas em parte das colunas, mas não em outras. Escrevendo um NOT EXISTS
equivalente, embora ligeiramente menos legível que EXCEPT
deve ser muito mais trivial de realizar - e geralmente levará a um plano melhor (mas observe que eu nunca diria ALWAYS
ou NEVER
, exceto da maneira que acabei de fazer). Nesta postagem do blog, demonstro pelo menos um caso em que
EXCEPT
é superado por um LEFT OUTER JOIN
construído corretamente e, claro, por um equivalente NOT EXISTS
variação.