Considere esta resposta no SO que tranquiliza o questionador sobre o <>
operador que:
<>
é ... o mesmo que!=
.
Mas então um comentarista se intromete e diz:
É verdade que eles são, funcionalmente, os mesmos. No entanto, como o otimizador SQL os usa é muito diferente. =/!= são simplesmente avaliados como verdadeiro/falso, enquanto <> significa que o mecanismo precisa verificar se o valor é maior ou menor, o que significa mais sobrecarga de desempenho. Apenas algo a considerar ao escrever consultas que podem ser caras.
Estou confiante de que isso é falso, mas, para abordar os céticos em potencial, me pergunto se alguém pode fornecer uma fonte autorizada ou canônica para provar que esses operadores não são apenas funcionalmente iguais, mas idênticos em todos os aspectos.
Durante a análise , o SQL Server chama
sqllang!DecodeCompOp
para determinar o tipo de operador de comparação presente:Isso ocorre bem antes de qualquer coisa no otimizador se envolver.
Rastreando o código usando um depurador e símbolos públicos*,
sqllang!DecodeCompOp
retorna um valor no registradoreax
** da seguinte forma:!=
e<>
ambos retornam 5, então são indistinguíveis em todas as operações posteriores (incluindo compilação e otimização).Embora secundário ao ponto acima, também é possível (por exemplo, usando o sinalizador de rastreamento não documentado 8605) examinar a árvore lógica passada para o otimizador para confirmar que ambos mapeiam para
!=
( não é igual à comparação do operador escalar).<>
ScaOp_Comp x_cmpNe
Por exemplo:
ambos produzem:
notas de rodapé
* Eu uso o WinDbg ; outros depuradores estão disponíveis. Os símbolos públicos estão disponíveis através do servidor de símbolos normal da Microsoft. Para obter mais informações, consulte Olhando mais profundamente no SQL Server usando Minidumps pela equipe de consultoria do cliente do SQL Server e Depuração do SQL Server com WinDbg – uma introdução de Klaus Aschenbrenner.
** O uso de EAX em derivados da Intel de 32 bits para valores de retorno de uma função é comum. Certamente o Win32 ABI faz dessa maneira, e tenho certeza que herda essa prática dos velhos tempos do MS-DOS, onde o AX era usado para o mesmo propósito - Michael Kjörling
Trabalho na Microsoft com suporte SQL e perguntei a Jack Li, engenheiro sênior de escalonamento e especialista no assunto de desempenho do SQL Server: "O SQL trata != de maneira diferente de <> ?" e ele disse: "Eles são os mesmos."
Acho que o seguinte prova que
<>
não faz 2 comparações.<>
como operador diferente, ( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ). Tecnicamente,!=
é uma extensão do padrão (embora eu não consiga pensar em nenhum RDBMS que não o implemente).<>
como 2 operadores, não um, faria o mesmo para o><
qual é de fato um erro de sintaxe.Isso está incorreto, Books Online (BOL) diz que eles são funcionalmente iguais:
!= (Não é igual a) (Transact-SQL)
E se você olhar para um plano de execução onde
!=
é usado, em Predicado, ele muda!=
para<>
.