解析中、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:Production.Product(エイリアス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
脚注
* WinDbgを使用します。他のデバッガーが利用可能です。パブリックシンボルは、通常のMicrosoftシンボルサーバーを介して利用できます。詳細については、SQL Serverカスタマーアドバイザリーチームによるミニダンプを使用したSQL Serverの詳細と、WinDbgによるSQL Serverのデバッグ -Klaus Aschenbrennerによる紹介を参照してください。
**関数からの戻り値に32ビットIntel導関数でEAXを使用することは一般的です。確かにWin32 ABIはそのように動作し、AXが同じ目的で使用されていた昔のMS-DOS時代からその慣習を継承していると確信しています-MichaelKjörling