पार्सिंग के दौरान , SQL सर्वर कॉल sqllang!DecodeCompOp
करने के लिए निर्धारित तुलना ऑपरेटर के प्रकार को प्रस्तुत करता है:
ऐसा तब होता है जब ऑप्टिमाइज़र में कुछ भी शामिल हो जाता है।
से तुलना ऑपरेटर्स (Transact-SQL)
डिबगर और सार्वजनिक प्रतीकों का उपयोग करके कोड को ट्रेस करना *, sqllang!DecodeCompOp
रजिस्टर में एक मूल्य देता है eax
** इस प्रकार है:
╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ < ║ 1 ║
║ = ║ 2 ║
║ <= ║ 3 ║
║ !> ║ 3 ║
║ > ║ 4 ║
║ <> ║ 5 ║
║ != ║ 5 ║
║ >= ║ 6 ║
║ !< ║ 6 ║
╚════╩══════╝
!=
और <>
दोनों 5 लौटते हैं, इसलिए बाद के सभी कार्यों (संकलन और अनुकूलन सहित) में अप्रभेद्य हैं ।
यद्यपि उपरोक्त बिंदु पर द्वितीयक है, यह भी संभव है (उदाहरण के लिए undocumented ट्रेस ध्वज 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] .प्रोडिड
LogOp_Select
LogOp_Get TBL: उत्पादन। उत्पाद (अन्य उपनाम: P)
ScaOp_Comp x_cmpNe
ScaOp_Identifier QCOL: [P] .प्रोडिड
ScaOp_Const TI (int, ML = 4) XVAR (int, स्वामित्व नहीं, मान = 4)
AncOp_PrjList
फुटनोट
* मैं WinDbg का उपयोग करता हूं ; अन्य डिबगर उपलब्ध हैं। सार्वजनिक प्रतीक सामान्य Microsoft प्रतीक सर्वर के माध्यम से उपलब्ध हैं। अधिक जानकारी के लिए, SQL सर्वर ग्राहक सलाहकार टीम और WinDbg के साथ एसक्यूएल सर्वर डिबगिंग द्वारा मिनिडंप का उपयोग करते हुए SQL सर्वर में गहराई से देखना देखें - क्लॉस एसचेनब्रेनर द्वारा एक परिचय ।
** एक फ़ंक्शन से रिटर्न वैल्यू के लिए 32-बिट इंटेल डेरिवेटिव पर EAX का उपयोग करना आम है। निश्चित रूप से Win32 ABI इस तरह से करता है, और मुझे पूरा यकीन है कि यह पुराने MS-DOS दिनों में वापस से उस अभ्यास को विरासत में मिला है, जहाँ AX का उपयोग उसी उद्देश्य के लिए किया गया था - माइकल केजर्लिंग