2012-11-08 29 views
7

कल हमें एक परिदृश्य मिला जहां db field का प्रकार प्राप्त करना पड़ा और इसके आधार पर हमें फ़ील्ड का विवरण लिखना पड़ा।डाटाबेस फ़ंक्शन वीएस केस स्टेटमेंट

Select (Case DB_Type When 'I' Then 'Intermediate' 
         When 'P' Then 'Pending' 
         Else 'Basic' 
     End) 
From DB_table 

मैंने इस केस स्टेटमेंट के बजाय एक डीबी फ़ंक्शन लिखने का सुझाव दिया क्योंकि यह अधिक पुन: प्रयोज्य होगा।

Select dbo.GetTypeName(DB_Type) 
from DB_table 

दिलचस्प हिस्सा है की तरह, हमारे डेवलपर से एक ने कहा का उपयोग कर डेटाबेस समारोह अक्षमdatabase functions के रूप में कर रहे हैं धीमी Case statement से हो जाएगा। मैंने जवाब खोजने के लिए इंटरनेट पर खोज की जो दक्षता के मामले में बेहतर दृष्टिकोण है लेकिन दुर्भाग्यवश मुझे कुछ भी नहीं मिला जिसे संतुष्ट उत्तर माना जा सकता है। कृपया मुझे अपने विचारों से उजागर करें, कौन सा दृष्टिकोण बेहतर है?

+1

क्या यह 'dbo.GetTypeName (DB_Type)' समान 'केस' अभिव्यक्ति है? यानी: आप 'केस' अभिव्यक्ति को सीधे एक क्वेरी में लिखने और प्रदर्शन और पुन: उपयोगिता के संदर्भ में उपयोगकर्ता परिभाषित फ़ंक्शन *** में डालकर अंतर के बारे में पूछ रहे हैं। सही? –

+0

हां! सबकुछ एक जैसा है। –

उत्तर

7
UDF function is always slower than case statements 

लेख

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

निम्न आलेख आप पता चलता है जब यूडीएफ

http://www.sql-server-performance.com/2005/sql-server-udfs/

का उपयोग करने के लिए कृपया देखें

सारांश:

नहीं है एक बड़े प्रदर्शन जुर्माना चुकाया जाता है जब उपयोगकर्ता परिभाषित कार्यों used.This दंड के रूप में गरीब क्वेरी निष्पादन समय जब एक प्रश्न पंक्तियाँ, आम तौर पर 1000 या अधिक की एक बड़ी संख्या के लिए एक यूडीएफ लागू होता है दिखाता है। जुर्माना लगाया जाता है क्योंकि SQL सर्वर डेटाबेस इंजन को अपना आंतरिक कर्सर प्रसंस्करण की तरह बनाना चाहिए। इसे प्रत्येक पंक्ति पर प्रत्येक यूडीएफ का आह्वान करना होगा। यदि WHDE खंड में यूडीएफ का उपयोग किया जाता है, तो यह पंक्तियों को फ़िल्टर करने के हिस्से के रूप में हो सकता है। यदि चयन सूची में यूडीएफ का उपयोग किया जाता है, तो क्वेरी प्रसंस्करण के अगले चरण में जाने के लिए क्वेरी के परिणाम बनाते समय ऐसा होता है। यह पंक्ति प्रसंस्करण द्वारा पंक्ति है जो SQL सर्वर को सबसे धीमा कर देती है।

1

आपका devolper सही है। कार्य आपकी क्वेरी को धीमा कर देंगे।

http://sqlblog.com/blogs/hugo_kornelis/archive/2012/05/20/t-sql-user-defined-functions-the-good-the-bad-and-the-ugly-part-1.aspx

Calling functionsis like: 
wrap parts into paper 
put it into a bag 
carry it to the mechanics 
let him unwrap, do something, wrapt then result 
carry it back 
use it 
+0

भले ही उसके पास समान 'केस' अभिव्यक्ति हो? –

1

स्केलर फ़ंक्शन (एक फ़ंक्शन जो एक मान देता है) का उपयोग करते समय फ़ंक्शन की सामग्री प्रति पंक्ति एक बार निष्पादित की जाएगी लेकिन केस स्टेटमेंट पूरे सेट में निष्पादित किया जाएगा।

पूरे सेट के विरुद्ध संचालन करके आप सर्वर को अपनी क्वेरी को अधिक कुशलतापूर्वक अनुकूलित करने की अनुमति देते हैं।

तो सिद्धांत यह है कि एक ही क्वेरी बड़े डेटासेट के खिलाफ दोनों तरीकों से चलती है तो फ़ंक्शन धीमा होना चाहिए। हालांकि, आपके डेटा के विरुद्ध संचालन करते समय अंतर छोटा हो सकता है ताकि आपको दोनों तरीकों का प्रयास करना चाहिए और यह निर्धारित करने के लिए उनका परीक्षण करना चाहिए कि कोई प्रदर्शन व्यापार बंद हो गया है या नहीं।