Во время синтаксического анализа SQL Server вызывает, sqllang!DecodeCompOp
чтобы определить тип оператора сравнения:
Это происходит задолго до того, как в оптимизатор вмешивается что-либо.
Из операторов сравнения (Transact-SQL)
Отслеживая код с использованием отладчика и открытых символов *, sqllang!DecodeCompOp
возвращает значение в регистре eax
** следующим образом:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
и <>
оба возвращают 5, поэтому неразличимы во всех последующих операциях (включая компиляцию и оптимизацию).
Хотя это и является вторичным по отношению к вышеупомянутому пункту, также возможно (например, с использованием недокументированного флага трассировки 8605) посмотреть на логическое дерево, переданное оптимизатору, чтобы подтвердить, что и то, !=
и другое <>
сопоставлено ScaOp_Comp x_cmpNe
(не равно сравнение скалярных операторов).
Например:
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);
оба производят:
LogOp_Project QCOL: [P] .ProductID
LogOp_Select
LogOp_Get TBL: производство.Продукт (псевдоним TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .ProductID
ScaOp_Const TI (int, ML = 4) XVAR (int, не принадлежит, Value = 4)
AncOp_PrjList
Сноски
* Я использую WinDbg ; другие отладчики доступны. Публичные символы доступны через обычный сервер символов Microsoft. Дополнительные сведения см. В разделах «Углубление изучения SQL Server с использованием мини-дампов » консультативной группы по работе с клиентами SQL Server и «Отладка SQL Server с помощью WinDbg» - введение Клауса Ашенбреннера.
** Использование EAX в 32-битных производных Intel для возвращаемых значений из функции является распространенным явлением. Конечно, Win32 ABI делает это таким образом, и я почти уверен, что он унаследовал эту практику от прежних времен MS-DOS, где AX использовался для той же цели - Майкл Кьёрлинг