2009-09-03 18 views
6

मैं एक प्रश्न है कि कुछ इस तरह करता है अनुकूलन करने के लिए कोशिश कर रहा हूँ:एसक्यूएलसेवर केस अभिव्यक्ति - शॉर्ट सर्किट मूल्यांकन?

SELECT 
    ... 
    CASE WHEN (condition) THEN (expensive function call #1) 
    ELSE (expensive function call #2) 
    END 
... 

क्वेरी योजना पता चलता है कि के लिए भी ऐसे मामलों में जहां पंक्तियों की 100% जब खंड को पूरा करना, समय का एक बड़ा हिस्सा में खर्च किया जाता है ईएलएसई शाखा में परिणाम के लिए कॉल।

एकमात्र तरीका मैं इसे समझ सकता हूं यह मानना ​​है कि SQLServer दोनों परिणामों का मूल्यांकन कर रहा है, फिर केवल WHEN स्थिति के मूल्यांकन के आधार पर एक का चयन कर रहा है, लेकिन मुझे कोई निश्चित संदर्भ नहीं मिल रहा है कि नहीं एक केस स्टेटमेंट के परिणाम सशर्त से पहले मूल्यांकन किया जाता है। क्या कोई मुझे संदर्भ में स्पष्टीकरण या इंगित कर सकता है?

+0

मैं इसकी पुष्टि नहीं कर सकता, भले ही मैं एक महंगी फ़ंक्शन का प्रयास करता हूं जो एक विशाल तालिका से पूछताछ करता है। यदि मैं सीएएसई का पहला भाग सत्य होने के लिए 100% सेट करता हूं, तो मेरी क्वेरी में 5 सेकंड लगते हैं। यदि नहीं, लगभग 10 मिनट। SQL सर्वर का कौन सा संस्करण? – MartW

उत्तर

1

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

+0

ओह, ज़ाहिर है, यही वह है। जब वास्तविक क्वेरी निष्पादित की जाती है, तो योजना पूरी तरह से अलग दिखती है। पहले के बारे में सोचने के लिए खेद है। –

9

एसक्यूएल एक घोषणात्मक भाषा है। आप वांछित परिणाम में एक क्वेरी में व्यक्त करते हैं और सर्वर उन परिणामों को वितरित करने के लिए जो भी साधन चुनने के लिए स्वतंत्र है। चूंकि एसक्यूएल epxressions के मूल्यांकन के आदेश निर्धारित और OR और AND मूल्यांकन शॉर्ट सर्किट नहीं होता है।

हालांकि CASE के लिए दस्तावेज़ वास्तव में कहा गया है order of evaluation occurs in the order of declaration और मूल्यांकन बंद हो जाता है कि बाद पहले की स्थिति उत्पन्न होने:,

  • का मूल्यांकन करता है input_expression, और उसके बाद निर्दिष्ट क्रम में का मूल्यांकन करता है input_expression = when_expression प्रत्येक WHEN खंड के लिए।

  • पहले input_expression = when_expression कि TRUE का मूल्यांकन की result_expression देता है।

इसका मतलब है कि अगर आप का मूल्यांकन गलत शाखा में अभिव्यक्ति देखते हैं, अपने मामले हालत सही नहीं है और कभी कभी गलत या अज्ञात के लिए मूल्यांकन करता है। सुनिश्चित करें कि एसक्यूएल के त्रि-मूल्य तर्क खाते में लिया गया है (यानी आप एनयूएलएल के लिए खाते हैं)। यह भी सुनिश्चित करें कि तालिका में डेटा वह है जिसे आप उम्मीद करते हैं (यानी स्थिति वास्तव में मामलों का 100% गलत मूल्यांकन करता है)।

+0

काफी नहीं। माइक्रोसॉफ्ट कनेक्ट के तहत दायर एक बग था, [एग्रीगेट्स सीएएसई के सेमेन्टिक्स का पालन न करें] (https://connect.microsoft.com/SQLServer/feedback/details/691535/), जिसने मूल्यांकन का आदेश जहां एक मामला प्रदर्शित किया 'केस' अभिव्यक्तियों का सम्मान नहीं किया जाता है। यहां तक ​​कि [एमएसडीएन दस्तावेज] (http://msdn.microsoft.com/en-us/library/ms181765.aspx) को अद्यतन किया गया है: "कुछ स्थितियों में, एक केस स्टेटमेंट अभिव्यक्ति के परिणाम प्राप्त करने से पहले एक अभिव्यक्ति का मूल्यांकन किया जाता है इसके इनपुट के रूप में। " – Douglas

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