Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

EXCEPT executa mais rápido que um JOIN quando as colunas da tabela são as mesmas


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:
  1. A consulta é mais legível (isso quase sempre será verdade).
  2. O desempenho foi aprimorado.

E AMBOS das seguintes são verdadeiras:
  1. 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.
  2. 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.