2012-06-27 26 views
16

में ऑपरेटर लघु सर्किट मैं एसक्यूएल सर्वर या शॉर्ट सर्किट परामर्श करना चाहतेया एसक्यूएल सर्वर

कोड:

DECLARE @tempTable table 
     (
     id int 
    ) 
     INSERT @tempTable(id) values(1) 

     DECLARE @id varchar(10) 
     SET @id = 'x' 
     SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully 
     SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int 

क्यों? 1 = 1 और @ आईडी = 'एक्स' सच है।

एसक्यूएल सर्वर OR ऑपरेटर: चाहे शॉर्ट सर्किट समारोह

धन्यवाद

+5

वहाँ ** कोई गारंटी नहीं है जो भी पर है ** कैसे और जो एक 'OR' हालत के कुछ हिस्सों पहले मूल्यांकन किया जाता है (या एक टी सभी)। टी-एसक्यूएल ** नहीं ** इस तरह सी # की तरह है। आप ** बूलियन शॉर्ट-सर्किटिंग पर भरोसा नहीं कर सकते हैं। –

+0

'क्यों? 1 = 1 और @ आईडी = 'x' सत्य है '- यह ** या ** वास्तव में, ** और ** नहीं है। –

+0

यहां, इस INSERT @tempTable (आईडी) मान (1) में, INTO गुम है। – vijay

उत्तर

14

एसक्यूएल के भीतर, कोई आवश्यकता है कि एक या खंड जल्दी टूट जाता है। दूसरे शब्दों में, यह ऑप्टिमाइज़र पर निर्भर करता है कि दोनों स्थितियों को एक साथ जांचना है या नहीं। मैं एमएसएसक्यूएल ऑप्टिमाइज़र में एक विशेषज्ञ नहीं हूं, लेकिन मैंने ऐसे उदाहरण देखे हैं जहां ऑप्टिमाइज़र ने एक या खंड को छोटा सर्किट नहीं किया है।

+0

का पुन: उपयोग करें या संक्षिप्त सर्किट मेरा संदेह है लेकिन मेरा कार्यालय कोडिंग एसक्यूएल है ((@ आईडी न्यूल या आईडी = आईडी है) और (@name IS NULL या name = @ name)) तो मैं जानना चाहता हूं कि शॉर्ट-सर्किट क्योंकि यह निर्णय प्रक्रिया दक्षता ऐसा करने के लिए, क्वेरी प्लान – NotTwoWayStreet

5

बस इस सवाल पर ठोकर खाई है, और पहले से ही इस ब्लॉग प्रविष्टि मिल गया था: http://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

एसक्यूएल सर्वर, कहीं भी एक प्रश्न अनुकूलन करने के लिए यह, फिट देखता है तो उदाहरण में ब्लॉग पोस्ट में दी गई नि: शुल्क है आप नहीं कर सकते शॉर्ट-सर्किटिंग पर भरोसा करें।

हालांकि, एक केस को स्पष्ट रूप से लिखित क्रम में मूल्यांकन करने के लिए दस्तावेज किया गया है - उस ब्लॉग पोस्ट की टिप्पणियों की जांच करें।

-1

यह लेकिन स्पष्ट है कि एमएस Sql सर्वर शॉर्ट सर्किट सिद्धांत का समर्थन करता है, अनावश्यक चेकिंग से बचने के प्रदर्शन में सुधार करने के लिए है,

सहायक उदाहरण:

SELECT 'TEST' 
WHERE 1 = 'A' 

SELECT 'TEST' 
WHERE 1 = 1 OR 1 = 'A' 

यहाँ, पहला उदाहरण त्रुटि में परिणाम होगा ' वर्चर मान 'ए' को डेटा प्रकार int में परिवर्तित करते समय रूपांतरण विफल रहा। '

जबकि दूसरी स्थिति आसानी से 1 = 1 के रूप में सत्य के रूप में मूल्यांकन करती है और इस प्रकार दूसरी स्थिति बिल्कुल नहीं चलती है।

इसके अलावा अधिक

SELECT 'TEST' 
WHERE 1 = 0 OR 1 = 'A' 
यहाँ

पहली शर्त गलत पर मूल्यांकन करेगा और इसलिए डीबीएमएस दूसरी शर्त के लिए जाना होगा और फिर आप ऊपर के उदाहरण में के रूप में रूपांतरण की त्रुटि मिल जाएगा।

नोट: मैं सिर्फ महसूस करने के लिए मौसम हालत निष्पादित किया जाता है या शॉर्ट सर्किट त्रुटि में क्वेरी परिणामों हालत फांसी संक्षिप्त-सर्किट अन्यथा अर्थ है कि अगर गलत हालत में लिखा था।

इसे आसानी से समझा

पर विचार करें,

WHERE 1 = 1 OR 2 = 2 

के रूप में पहली शर्त सही के लिए मूल्यांकन किया जा रहा है, अपनी दूसरी स्थिति का मूल्यांकन करने अर्थहीन क्योंकि में जो कुछ भी मूल्य परिणाम को प्रभावित नहीं करेगा उसके मूल्यांकन बिलकुल भी, इसलिए अनावश्यक स्थिति की जांच या मूल्यांकन छोड़कर क्वेरी निष्पादन समय को बचाने के लिए एसक्यूएल सर्वर के लिए इसका अच्छा अवसर है।

के मामले में

"या" के रूप में दूसरों के मूल्यांकन के बिना सच के लिए मूल्यांकन अगर पहली शर्त सही को से जुड़े हुए पूरी श्रृंखला मूल्यांकन किया जाता है "या" माना जाएगा।

condition1 OR condition2 OR ..... OR conditionN 

यदि स्थिति 1 का मूल्यांकन सही है, तो शर्तों तक सभी शर्तों को आराम दें, एन छोड़ दिया जाएगा। सामान्य TRUE के निर्धारण पर सामान्यीकृत शब्दों में, या अन्य सभी शर्तों को छोड़ दिया जाएगा।

दूसरी शर्त

WHERE 1 = 0 AND 1 = 1 

के रूप में पहली शर्त को evalutated हो रही है पर विचार करें गलत अपने तो फिर से, क्योंकि इसके मूल्यांकन जो कुछ भी मूल्य में बिल्कुल परिणाम को प्रभावित नहीं करेगा दूसरी स्थिति का मूल्यांकन करने अर्थहीन अनावश्यक स्थिति की जांच या मूल्यांकन छोड़कर क्वेरी निष्पादन समय को बचाने के लिए एसक्यूएल सर्वर के लिए इसका अच्छा अवसर।

के मामले में

"और" अगर पहली शर्त गलत को "और" के साथ जुड़े हुए पूरी श्रृंखला मूल्यांकन किया जाता है के रूप में दूसरों के मूल्यांकन के बिना असत्य के लिए मूल्यांकन पर विचार किया जाएगा।

condition1 AND condition2 AND ..... conditionN 

अगर CONDITION1 गलत लिए मूल्यांकन किया जाता है, को छोड़ दिया हो जाएगा conditionN तक शर्तों के सभी आराम। सामान्य FALSE के निर्धारण पर सामान्यीकृत शब्दों में, और से जुड़ी सभी अन्य स्थितियों को छोड़ दिया जाएगा।

वजह, एक बुद्धिमान प्रोग्रामर हमेशा इस तरह से शर्तों की श्रृंखला कार्यक्रम चाहिए था कि कम महंगी या सबसे नष्ट शर्त, पहले का मूल्यांकन या इस तरह से कि लघु सर्किट

के अधिकतम लाभ लग सकता हालत की व्यवस्था हो जाता है

धन्यवाद और सादर,

Rk_Hirpara

+3

डाउनवोट कारण का पुन: उपयोग करें: उचित डेटा सेट के साथ हमेशा वास्तविक सर्वर पर चीजों का परीक्षण करें।उदाहरण के लिए, इसे और अधिक यथार्थवादी कोशिश करें जहां एक वर्ण फ़ील्ड के खिलाफ खंड - जहां संख्यात्मक (फ़ील्डनाम) = 1 और कनवर्ट (दशमलव, फ़ील्डनाम) <= 0 - आपको पता चलेगा कि यह उन पंक्तियों पर रूपांतरण त्रुटि पीड़ित है जहां संख्यात्मक = 0 है, भले ही तकनीकी रूप से ऐसी पंक्तियों पर दूसरी स्थिति का मूल्यांकन करने की आवश्यकता नहीं है। – Jasmine

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^