Podczas analizowania wywołania programu SQL Server w sqllang!DecodeCompOp
celu ustalenia rodzaju obecnego operatora porównania:
Dzieje się to na długo przed zaangażowaniem się w optymalizator.
Od operatorów porównania (Transact-SQL)
Śledzenie kodu za pomocą debugera i symboli publicznych * sqllang!DecodeCompOp
zwraca wartość w rejestrze eax
** w następujący sposób:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
i <>
oba zwracają 5, więc są nierozróżnialne we wszystkich późniejszych operacjach (łącznie z kompilacją i optymalizacją).
Chociaż wtórne do powyższego punktu, możliwe jest również (np. Użycie nieudokumentowanej flagi śledzenia 8605) spojrzenie na drzewo logiczne przekazane do optymalizatora w celu potwierdzenia tego !=
i <>
odwzorowania na ScaOp_Comp x_cmpNe
(nierównomierne porównanie operatorów skalarnych).
Na przykład:
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);
oba wytwarzają:
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, Not Owned, Value = 4)
AncOp_PrjList
Przypisy
* Używam WinDbg ; dostępne są inne debugery. Symbole publiczne są dostępne za pośrednictwem zwykłego serwera symboli Microsoft. Aby uzyskać więcej informacji, zobacz Zagłębianie się w SQL Server przy użyciu programu Minidumps przez zespół doradców klienta SQL Server i debugowanie programu SQL Server za pomocą WinDbg - wprowadzenie Klausa Aschenbrennera.
** Używanie EAX w 32-bitowych instrumentach pochodnych Intela do zwracania wartości z funkcji jest powszechne. Z pewnością Win32 ABI robi to w ten sposób i jestem pewien, że dziedziczy tę praktykę po dawnych czasach MS-DOS, w których AX był używany do tego samego celu - Michael Kjörling