Durante a análise , o SQL Server chama sqllang!DecodeCompOp
para determinar o tipo de operador de comparação presente:
Isso ocorre muito antes de qualquer coisa no otimizador se envolver.
De operadores de comparação (Transact-SQL)
Rastrear o código usando um depurador e símbolos públicos *, sqllang!DecodeCompOp
retorna um valor no registro eax
** da seguinte maneira:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
e <>
ambos retornam 5, portanto são indistinguíveis em todas as operações posteriores (incluindo compilação e otimização).
Embora seja secundário ao ponto acima, também é possível (por exemplo, usando o sinalizador de rastreio não documentado 8605) observar a árvore lógica transmitida ao otimizador para confirmar que ambos !=
e o <>
mapeamento ScaOp_Comp x_cmpNe
(comparação do operador escalar não é igual).
Por exemplo:
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID != 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID <> 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);
ambos produzem:
QCOL do LogOp_Project: [P] .ProductID
LogOp_Select
LogOp_Get TBL: Production.Product (também conhecido por TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .ProductID
ScaOp_Const TI (int, ML = 4) XVAR (int, Não possuído, Valor = 4)
AncOp_PrjList
Notas de rodapé
* Eu uso o WinDbg ; outros depuradores estão disponíveis. Símbolos públicos estão disponíveis no servidor de símbolos da Microsoft. Para obter mais informações, consulte Analisando mais detalhadamente o SQL Server usando Minidumps pela equipe de consultoria ao cliente do SQL Server e a depuração do SQL Server com WinDbg - uma introdução por Klaus Aschenbrenner.
** O uso do EAX em derivados da Intel de 32 bits para valores de retorno de uma função é comum. Certamente, a ABI do Win32 faz dessa maneira, e tenho certeza de que herda essa prática dos velhos tempos do MS-DOS, onde o AX era usado para o mesmo objetivo - Michael Kjörling