2009-08-07 9 views
7

मैं कुछ पुरानी संग्रहीत प्रक्रिया को फिर से लिख रहा हूं और इनलाइन कोड की बजाय फ़ंक्शन का उपयोग करते समय मुझे एक अप्रत्याशित प्रदर्शन समस्या मिली है।क्यों एक साधारण टी-एसक्यूएल यूडीएफ फ़ंक्शन कोड निष्पादन को 3 गुना धीमा बनाता है

समारोह के रूप में पालन बहुत सरल है:

ALTER FUNCTION [dbo].[GetDateDifferenceInDays] 
(  
@first_date SMALLDATETIME, 
@second_date SMALLDATETIME 
) 
RETURNS INT 
AS 
BEGIN 

RETURN ABS(DATEDIFF(DAY, @first_date, @second_date)) 

END 

तो मुझे मिल गया है दो समान प्रश्नों, लेकिन एक समारोह का उपयोग करता है और अन्य क्वेरी अपने आप में गणना करता है:

ABS(DATEDIFF(DAY, [mytable].first_date, [mytable].second_date)) 

अब इनलाइन कोड के साथ क्वेरी फ़ंक्शन का उपयोग करके 3 गुना तेज है।

उत्तर

14

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

here, here और here देखें यूडीएफ का उपयोग करने के छेड़छाड़ के नुकसान के विस्तृत स्पष्टीकरण के लिए।

+0

पोस्ट करने के लिए धन्यवाद। आपका अंतिम लिंक इस समस्या पर एक अच्छा अनुभवजन्य विश्लेषण है लेकिन यह समझ में नहीं आता कि यह व्यवहार क्यों है। –

+1

@nagul - आपका पहला लिंक खराब है। ऐसा लगता है कि एसक्यूएलमैग ने अपना यूआरएल बदल दिया है। कोई मौका यह लेख है? http://sqlmag.com/user-defined-function-udf/udfs-endanger-performance – EBarr

5

उपयोग संदर्भ के आधार पर, क्वेरी ऑप्टिमाइज़र इनलाइन कोड का विश्लेषण करने और क्वेरी प्लान का उपयोग करके एक महान अनुक्रमणिका का पता लगाने में सक्षम हो सकता है, जबकि यह समान रूप से विस्तृत विश्लेषण के लिए "फ़ंक्शन इनलाइन" नहीं करता है और इसलिए समाप्त होता है फ़ंक्शन शामिल होने पर एक निम्न क्वेरी योजना के साथ। दो क्वेरी योजनाओं को एक तरफ देखो, और आप इस परिकल्पना को आसानी से पुष्टि (या अस्वीकार) करने में सक्षम होना चाहिए!

+0

पोस्ट करने के लिए धन्यवाद। मैंने दो निष्पादन योजनाओं का विश्लेषण किया और वे समान हैं कि स्केलर यूडीएफ का उपयोग नहीं करने वाले व्यक्ति ने नेस्टेड लूप (3 अवसर) निष्पादित करने से पहले "समांतरता" है। मुझे पता है कि समांतरता निष्पादन समय में सुधार करती है क्योंकि यह एकाधिक प्रोसेसर का लाभ लेती है; लेकिन क्या मुझे लगता है कि यह निष्पादन योजना में समांतरता की कमी के कारण है? –

13

धीमी स्केलर यूडीएफ का उपयोग न करें, एक तेज इनलाइन का उपयोग करें। यहाँ उदाहरण:

Reuse Your Code with Table-Valued UDFs

Calculating third Wednesday of the month with inline UDFs

Many nested inline UDFs are very fast

सवाल बहुत आम है: यह कहा गया है और सैकड़ों बार जवाब से पहले, इस तरह के रूप में यह कुछ डिब्बाबंद जवाब है।

+1

जो भी डाउनवॉटेड है, कृपया कारण प्रदान करें। –

+1

@Alex: आपकी पोस्ट को स्पैम के रूप में भी चिह्नित किया गया है, इसलिए मेरा अनुमान होगा कि कोई (मुझे नहीं!) सोचता है कि आप सवाल का जवाब देने के बजाय अपने ब्लॉग के लिंक स्पैमिंग कर रहे हैं। – RichieHindle

+2

यदि लिंक प्रश्न का उत्तर देते हैं, तो इससे कोई फर्क नहीं पड़ता कि वे पोस्टर के ब्लॉग से आते हैं या नहीं। उसे कुछ Google रस प्राप्त करने दें। ऐसा नहीं है कि वह पत्रिका सदस्यता बेच रहा है। यह एक अच्छा ब्लॉग है; मेरा अनुमान है कि फ्लैगर ने इसे भी नहीं देखा है। –

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