Entre alguns desenvolvedores do SQL Server, é uma crença amplamente difundida que NOT IN
é terrivelmente lenta e as consultas devem ser reescritas para que eles retornem o mesmo resultado, mas não usem as palavras-chave "más". ( exemplo ).
Há alguma verdade nisso?
Existe, por exemplo, algum bug conhecido no SQL Server (qual versão?) Que faz com que as consultas NOT IN
tenham um plano de execução pior do que uma consulta equivalente que use
- um
LEFT JOIN
combinado com umNULL
cheque ou (SELECT COUNT(*) ...) = 0
naWHERE
cláusula?
sql-server
query-performance
except
Heinzi
fonte
fonte
IN
/NOT IN
sempre será implementado com loops aninhados. E não tenho ideia do questops SQL Server from creating a ‘plan’
deve significar.Respostas:
Não acho que tenha algo 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: cliente nº 2. Aqui estão três maneiras pelas quais eu poderia escrever uma consulta para encontrar essas informações (existem outras):
Resultados:
Agora, também existem alguns problemas de desempenho, e eu falo sobre eles nesta postagem do blog . Dependendo dos dados e índices,
NOT EXISTS
geralmente terá um desempenho superiorNOT 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, para que você possa acabar com dados diferentes (novamente, dependendo da fonte). E que oLEFT OUTER JOIN ... WHERE right.column IS NULL
padrão popular é sempre o pior artista.Martin Smith também tem muitas informações de suporte boas em sua resposta ao SO .
fonte