Durante el análisis , SQL Server llama sqllang!DecodeCompOp
para determinar el tipo de operador de comparación presente:
Esto ocurre mucho antes de que algo en el optimizador se involucre.
De operadores de comparación (Transact-SQL)
Al rastrear el código utilizando un depurador y símbolos públicos *, se sqllang!DecodeCompOp
devuelve un valor en el registro eax
** de la siguiente manera:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
y <>
ambos devuelven 5, por lo que no se pueden distinguir en todas las operaciones posteriores (incluida la compilación y la optimización).
Aunque es secundario al punto anterior, también es posible (por ejemplo, usar el indicador de traza no documentado 8605) mirar el árbol lógico pasado al optimizador para confirmar que ambos !=
y <>
mapear ScaOp_Comp x_cmpNe
(comparación de operador no escalar igual).
Por ejemplo:
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 producen:
LogOp_Project QCOL: [P] .ProductID
LogOp_Select
LogOp_Get TBL: Production.Product (alias TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .ProductID
ScaOp_Const TI (int, ML = 4) XVAR (int, no propiedad, valor = 4)
AncOp_PrjList
Notas al pie
* Yo uso WinDbg ; Otros depuradores están disponibles. Los símbolos públicos están disponibles a través del servidor de símbolos habitual de Microsoft. Para obtener más información, consulte Profundizar en SQL Server utilizando Minidumps del Equipo de asesoramiento al cliente de SQL Server y Depuración de SQL Server con WinDbg: una introducción de Klaus Aschenbrenner.
** El uso de EAX en derivados Intel de 32 bits para valores de retorno de una función es común. Ciertamente, el Win32 ABI lo hace de esa manera, y estoy bastante seguro de que hereda esa práctica de los viejos tiempos de MS-DOS, donde AX se usaba para el mismo propósito: Michael Kjörling