Entre alguns desenvolvedores do SQL Server, é uma crença amplamente aceita que NOT IN
é terrivelmente lento e as consultas devem ser reescritas para que retornem o mesmo resultado, mas não usem as palavras-chave "malvadas". ( exemplo ).
Há alguma verdade nisso?
NOT IN
Existe, por exemplo, algum bug conhecido no SQL Server (qual versão?)
- a
LEFT JOIN
combinado com umNULL
cheque ou (SELECT COUNT(*) ...) = 0
naWHERE
cláusula?
Acho que não tem nada a ver com ser terrivelmente lento; tem a ver com ser potencialmente impreciso. Por exemplo, dados os seguintes dados - pedidos que podem ser feitos por um cliente individual ou por um parceiro B2B:
Digamos que eu queira encontrar todos os clientes que nunca fizeram um pedido. Dados os dados, há apenas um: o cliente nº 2. Aqui estão três maneiras de escrever uma consulta para encontrar essas informações (existem outras):
Resultados:
Agora, também existem alguns problemas de desempenho, e falo sobre eles nesta postagem do blog . Dependendo dos dados e índices,
NOT EXISTS
geralmente superaNOT IN
, e não sei se poderia ter um desempenho pior. Você também deve observar queEXCEPT
pode introduzir uma operação de classificação distinta, portanto, pode acabar com dados diferentes (novamente, dependendo da fonte).LEFT OUTER JOIN ... WHERE right.column IS NULL
E que o padrão popular é sempre o de pior desempenho.Martin Smith também tem muitas informações de apoio em sua resposta sobre o SO .