लॉजिकल ऑपरेटर OR और WHERE में शर्तों के क्रम और स्थिति


33

आइए इन दो बयानों की जांच करें:

IF (CONDITION 1) OR (CONDITION 2)
...

IF (CONDITION 3) AND (CONDITION 4)
...

यदि CONDITION 1है TRUE, CONDITION 2तो जाँच की जाएगी ?
यदि CONDITION 3है FALSE, CONDITION 4तो जाँच की जाएगी ?

शर्तों के बारे में क्या WHERE: क्या SQL सर्वर इंजन एक WHEREक्लॉज में सभी स्थितियों का अनुकूलन करता है ? क्या प्रोग्रामर को सही क्रम में स्थितियां सुनिश्चित करनी चाहिए कि SQL सर्वर ऑप्टिमाइज़र इसे सही तरीके से हल करे ?

जोड़े गए:

जैक को लिंक के लिए धन्यवाद, टी-एसक्यूएल कोड से आश्चर्य:

IF  1/0 = 1 OR 1 = 1
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result


IF  1/0 = 1 AND 1 = 0
      SELECT 'True' AS result
ELSE
      SELECT 'False' AS result

इस मामले में शून्य अपवाद द्वारा एक विभाजन नहीं बढ़ा है ।

निष्कर्ष:

यदि C ++ / C # / VB में शॉर्ट-सर्कुलेटिंग है तो SQL सर्वर में क्यों नहीं हो सकता है?

इसका सही उत्तर देने के लिए आइए एक नज़र डालते हैं कि दोनों ही स्थितियों के साथ कैसे काम करते हैं। C ++ / C # / VB सभी में कोड निष्पादन को गति देने के लिए भाषा विशिष्टताओं में परिभाषित लघु परिच्छेद हैं। एन या स्थितियों के मूल्यांकन में परेशान क्यों करें जब पहले वाला पहले से ही सच है या एम एंड की स्थिति जब पहला वाला पहले से ही झूठ है।

हम डेवलपर्स के रूप में जानते हैं कि SQL सर्वर अलग तरह से काम करता है। यह लागत आधारित प्रणाली है। हमारे क्वेरी के लिए इष्टतम निष्पादन योजना प्राप्त करने के लिए क्वेरी प्रोसेसर को हर उस स्थिति का मूल्यांकन करना होगा और इसे एक लागत आवंटित करना होगा। इन लागतों का मूल्यांकन एक संपूर्ण सीमा के रूप में किया जाता है जो कि एक अच्छी योजना के लिए परिभाषित थ्रेशोल्ड SQL सर्वर से कम होनी चाहिए। यदि लागत निर्धारित सीमा से कम है, तो योजना का उपयोग किया जाता है, यदि पूरी प्रक्रिया को फिर से हालत लागतों के एक अलग मिश्रण के साथ दोहराया नहीं जाता है। यहाँ लागत या तो एक स्कैन है या एक मर्ज या मर्ज ज्वाइन या हैश जॉइन वगैरह ... इसके कारण C-/ C # / VB में उपलब्ध शॉर्ट-सर्कुलेटिंग बस संभव नहीं है। आप सोच सकते हैं कि एक स्तंभ पर सूचकांक के उपयोग को कम परिवृत्त के रूप में गिना जाता है, लेकिन ऐसा नहीं है। यह केवल उस सूचकांक के उपयोग को मजबूर करता है और इसके साथ ही संभावित निष्पादन योजनाओं की सूची को छोटा करता है। प्रणाली अभी भी लागत आधारित है।

एक डेवलपर के रूप में आपको पता होना चाहिए कि SQL सर्वर शॉर्ट-सर्कुलेटिंग नहीं करता है जैसे कि अन्य प्रोग्रामिंग भाषाओं में किया जाता है और ऐसा कुछ भी नहीं है जिसे आप इसे करने के लिए मजबूर कर सकें।


अंतिम उद्धरण ब्लॉक कहां से है? क्या आप एक संदर्भ जोड़ सकते हैं?
निक चामास

जवाबों:


25

SQL सर्वर में कोई गारंटी नहीं है कि क्या या किस क्रम में बयानों को एक WHEREखंड में संसाधित किया जाएगा । एकल अभिव्यक्ति जो बयान को संक्षिप्त करने की अनुमति देती है CASE- है WHEN। निम्नलिखित एक उत्तर मैं Stackoverflow पर पोस्ट से है:

कैसे SQL सर्वर शॉर्ट-सर्किट की स्थिति का मूल्यांकन करता है

ऐसा तब होता है जब यह ऐसा महसूस करता है, लेकिन उस तरीके से नहीं जैसा आप तुरंत सोचते हैं।

एक डेवलपर के रूप में आपको पता होना चाहिए कि SQL सर्वर शॉर्ट-सर्कुलेटिंग नहीं करता है जैसे कि अन्य प्रोग्रामिंग भाषाओं में किया जाता है और ऐसा कुछ भी नहीं है जिसे आप इसे करने के लिए मजबूर कर सकें

अधिक जानकारी के लिए उपरोक्त ब्लॉग प्रविष्टि में पहले लिंक की जाँच करें, जो दूसरे ब्लॉग के लिए अग्रणी है:

SQL सर्वर शॉर्ट-सर्किट करता है?

अंतिम फैसला? ठीक है, मेरे पास वास्तव में अभी तक एक नहीं है, लेकिन यह कहना शायद सुरक्षित है कि केवल एक विशिष्ट शॉर्ट-सर्किट सुनिश्चित कर सकते हैं जब आप कई अभिव्यक्ति में कई शर्तों को व्यक्त करते हैं। मानक बूलियन अभिव्यक्तियों के साथ, ऑप्टिमाइज़र चीजों को स्थानांतरित कर देगा क्योंकि यह आपके द्वारा क्वेरी किए जा रहे टेबल, इंडेक्स और डेटा के आधार पर फिट दिखाई देता है।


2
जाहिरा तौर पर कुछ किनारे मामले (या एक बग) हैं जहां भी case सुरक्षित नहीं है
जैक डगलस

1
मैं भी एक अन्य मामले (! हेक्टेयर) जहां का प्रदर्शन CASE: टूट जाता है dba.stackexchange.com/questions/12941/...
हारून बर्ट्रेंड


0

एसक्यूएल एक घोषणात्मक प्रोग्रामिंग भाषा है। इसके विपरीत, कहना, C ++ जो एक अनिवार्य है प्रोग्रामिंग भाषा है।

यानी आप इसे बता सकते हैं कि आप अंतिम परिणाम में क्या चाहते हैं, लेकिन आप यह नहीं बता सकते कि कैसे परिणाम निष्पादित किया जा रहा है, यह इंजन तक है।

अंदर "शॉर्ट-सर्कुलेटिंग" (या किसी अन्य नियंत्रण प्रवाह ) की गारंटी करने का एकमात्र सही तरीका हैWHERE अनुक्रमित विचारों, अस्थायी तालिकाओं और समान तंत्र का उपयोग करना है।

पुनश्च। आप निष्पादन योजना के संकेत का उपयोग भी कर सकते हैं (इंजन को "क्विक" करने के लिए कि किसी क्वेरी को कैसे निष्पादित किया जाए, जिसे उपयोग करने के लिए अनुक्रमित करें और उन्हें कैसे उपयोग करें), बस सोचा कि मुझे इसका उल्लेख करना चाहिए, जबकि हम इस विषय पर हैं ...


-4

1) - या (कोई भी या दोनों ही स्थितियाँ TRUE होगी)

अगर हालत 1 TRUE है तो कंडीशन 2 भी जाँच करेगा कि यह TRUE या FALSE हो सकता है

- और (दोनों शर्तों को सही होना चाहिए)

यदि शर्त 1 FALSE है तो हालत 2 की जाँच नहीं की जाएगी


"अगर हालत 1 FALSE है तो हालत 2 की जाँच नहीं की जाएगी" यह सच नहीं है। ऊपर उत्तर देखें । SQL सर्वर अभी भी स्थिति 2 का मूल्यांकन कर सकता है क्योंकि यह WHEREखंडों में शॉर्ट-सर्किट मूल्यांकन नहीं करता है ।
निक चामास

-4

यह नियंत्रित करने का एकमात्र तरीका है कि WHERE क्लॉज़ के भीतर स्थितियां एक साथ समूह बनाने के लिए कोष्ठक का उपयोग कैसे करें।

WHERE Col1 = 'Something' AND Col2 = 'Something' OR Col3 = 'Something' and Col4 = 'Something'

से बहुत अलग है

WHERE (Col1 = 'Something' AND Col2 = 'Something') OR (Col3 = 'Something' and Col4 = 'Something')

बस उत्सुक। ये दोनों स्थितियां कैसे भिन्न हैं? विभिन्न परिणाम, प्रदर्शन, निष्पादन योजना? मुझे लगा कि वे समकक्ष होंगे।
ypercube y

पहले एक के साथ आपको Col1, Col4 और या तो Col2 या Col3 से मिलान करना होगा। Col1 और Col2 से मेल करने के लिए दूसरी पंक्ति में या आपको Col3 और Col4 से मिलान करने की आवश्यकता है लेकिन Col1 और Col4 को कभी भी दोनों का एक साथ मूल्यांकन करने की आवश्यकता नहीं होगी।
mrdenny

1
नहीं आप गलत हैं। ANDसे अधिक पूर्वता है OR। दोनों बराबर हैं। आप जो कहते हैं वह WHERE Col1 = x AND (Col2 = x OR Col3 = x) AND Col4 = xक्वेरी के लिए सही होगा । एसक्यूएल-फिडल परीक्षण
ypercube-
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.