आधिकारिक स्रोत जो <> और! = SQL सर्वर में प्रदर्शन के समान हैं


74

एसओ के इस जवाब पर विचार करें कि <>ऑपरेटर के बारे में पूछने वाले को आश्वस्त करता है कि:

<>है ... जैसा है !=

लेकिन फिर एक टिप्पणीकार ने कहा, ''

यह सच है कि वे, कार्यात्मक रूप से, समान हैं। हालाँकि, SQL ऑप्टिमाइज़र उन्हें कैसे उपयोग करता है यह बहुत अलग है। = /! = का केवल सही / गलत के रूप में मूल्यांकन किया जाता है जबकि <> का अर्थ है कि इंजन को देखना और देखना है कि क्या मूल्य इससे अधिक या कम है, जिसका अर्थ है अधिक प्रदर्शन ओवरहेड। महज प्रश्न लिखने पर विचार करने के लिए कुछ महंगा हो सकता है।

मुझे विश्वास है कि यह गलत है, लेकिन संभावित संशयवादियों को संबोधित करने के लिए, मुझे आश्चर्य है कि क्या कोई यह साबित करने के लिए आधिकारिक या विहित स्रोत प्रदान कर सकता है कि ये ऑपरेटर केवल कार्यात्मक रूप से समान नहीं हैं, लेकिन सभी पहलुओं में समान हैं?

जवाबों:


144

पार्सिंग के दौरान , 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 का उपयोग उसी उद्देश्य के लिए किया गया था - माइकल केजर्लिंग


58

मैं SQL सपोर्ट में Microsoft में काम करता हूं और मैंने जैक ली, सीनियर एस्केलेशन इंजीनियर और एसक्यूएल सर्वर प्रदर्शन के विषय विशेषज्ञ से पूछा, "क्या एसक्यूएल का इलाज होता है? = किसी भी तरह से <>?" और उन्होंने कहा, "वे समान हैं।"


8

मुझे लगता है कि निम्नलिखित साबित होता है कि <>2 तुलना नहीं करता है।

  1. SQL मानक 92 <>ऑपरेटर के बराबर नहीं परिभाषित करता है , ( http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt )। तकनीकी रूप से, !=मानक के लिए एक विस्तार है (भले ही मैं किसी भी आरडीबीएमएस के बारे में नहीं सोच सकता जो इसे लागू नहीं करता है)।
  2. यदि SQLServer <>को 2 ऑपरेटरों के रूप में माना जाता है, तो एक नहीं, यह वही करेगा ><जिसके लिए वास्तव में वाक्यविन्यास त्रुटि है।

1

यह गलत है, पुस्तकें ऑनलाइन (BOL) कहती हैं कि वे कार्यात्मक रूप से समान हैं:

! = (समान नहीं) (लेनदेन-एसक्यूएल)

और यदि आप एक निष्पादन योजना को देखते हैं, जहां !=प्रयोग किया जाता है, तो Predicate के तहत, यह बदल != जाता है <>


2
समस्या यह है कि भाषा "कार्यात्मक रूप से समान" पहले से संदर्भित टिप्पणी में स्वीकार की जाती है, लेकिन आपके और मेरे ज्ञान के बावजूद प्रदर्शन के बारे में एक अतिरिक्त अंतर बनाता है कि "कार्यात्मक रूप से समान" में यह शामिल है कि यह वास्तव में कैसे काम करता है और किसी भी प्रदर्शन विशेषताओं का। यदि सभी निर्धारित संशयवाद से परे यह साबित करने जा रहे हैं, तो कोई क्या करेगा?
EricE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.