Lors de l'analyse , SQL Server appelle sqllang!DecodeCompOp
pour déterminer le type d'opérateur de comparaison présent:
Cela se produit bien avant que quoi que ce soit dans l'optimiseur ne soit impliqué.
À partir d' opérateurs de comparaison (Transact-SQL)
Le traçage du code à l'aide d'un débogueur et de symboles publics * sqllang!DecodeCompOp
renvoie une valeur dans le registre eax
** comme suit:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
et les <>
deux retournent 5, sont donc indiscernables dans toutes les opérations ultérieures (y compris la compilation et l'optimisation).
Bien que secondaire au point ci - dessus, il est également possible (par exemple en utilisant l' indicateur de trace sans papier 8605) pour regarder l'arbre logique est passé à l'optimiseur pour confirmer que les deux !=
et la <>
carte à ScaOp_Comp x_cmpNe
(pas égale comparaison de l' opérateur scalaire).
Par exemple:
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);
les deux produisent:
LogOp_Project QCOL: [P] .ProductID
LogOp_Select
LogOp_Get TBL: Production.Product (alias TBL: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .ID du produit
ScaOp_Const TI (int, ML = 4) XVAR (int, non possédé, valeur = 4)
AncOp_PrjList
Notes de bas de page
* J'utilise WinDbg ; d'autres débogueurs sont disponibles. Les symboles publics sont disponibles via le serveur de symboles Microsoft habituel. Pour plus d'informations, voir Approfondissement de SQL Server à l'aide de Minidumps par l'équipe de conseil aux clients SQL Server et Débogage de SQL Server avec WinDbg - Introduction de Klaus Aschenbrenner.
** L'utilisation de EAX sur des dérivés 32 bits d'Intel pour renvoyer les valeurs d'une fonction est courante. Certes, l’ABI Win32 le fait de cette façon, et je suis à peu près sûr qu’il hérite de cette pratique de l’ancien système MS-DOS, où AX était utilisé dans le même but - Michael Kjörling