Während des Parsens ermittelt SQL Server sqllang!DecodeCompOp
den Typ des vorhandenen Vergleichsoperators:
Dies geschieht lange bevor irgendetwas im Optimierer involviert wird.
Von Vergleichsoperatoren (Transact-SQL)
Wenn Sie den Code mithilfe eines Debuggers und öffentlicher Symbole * sqllang!DecodeCompOp
verfolgen, wird ein Wert im Register eax
** wie folgt zurückgegeben:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
und <>
beide 5 zurückkehren, so sind nicht zu unterscheiden in allen späteren Operationen (einschließlich Erstellung und Optimierung).
Obwohl ein Zusatz zu dem oben genannten Punkt, ist es auch möglich (zB mit undokumentierte Trace - Flag 8605) in der logischen Struktur für das Optimierungsprogramm übergeben zu sehen , dass sowohl zu bestätigen !=
und <>
Karte auf ScaOp_Comp x_cmpNe
(nicht gleich skalar Operator Vergleich).
Zum Beispiel:
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);
beide produzieren:
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, nicht im Besitz, Wert = 4)
AncOp_PrjList
Fußnoten
* Ich benutze WinDbg ; andere Debugger sind verfügbar. Öffentliche Symbole sind über den üblichen Microsoft-Symbolserver verfügbar. Weitere Informationen finden Sie unter Weitere Informationen zu SQL Server mithilfe von Minidumps des SQL Server-Kundenberatungsteams und unter Debuggen von SQL Server mit WinDbg - eine Einführung von Klaus Aschenbrenner.
** Die Verwendung von EAX für 32-Bit-Intel-Derivate für Rückgabewerte einer Funktion ist üblich. Sicherlich macht das Win32-ABI das so, und ich bin mir ziemlich sicher, dass es diese Praxis aus früheren MS-DOS-Zeiten erbt, als AX für denselben Zweck verwendet wurde - Michael Kjörling