2013-12-10 13 views
6

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

मैं listed here के रूप में कुछ अंतरों को याद करने में सक्षम था, लेकिन उन्होंने उनमें से किसी को बेसिक अंतर के रूप में स्वीकार नहीं किया।

उनके अनुसार उत्तर यह था कि एसपी केवल एक बार संकलित किए जाते हैं जबकि यूडीएफ को हर बार संकलित किया जाता है जिसके परिणामस्वरूप यूडीएफ संग्रहित प्रक्रिया से काफी धीमी होती है।

अब मैंने खोज की है लेकिन स्पष्ट कट जवाब नहीं मिला है कि यह दावा सही है या नहीं। कृपया इसे सत्यापित करें।

+0

मुझे पता है कि यूडीएफ के लिए अनुमानित पंक्तियों की गणना 1 है ... –

+0

वे गलत हैं। जब भी उन्हें बुलाया जाता है तो यूडीएफ को फिर से सम्मिलित नहीं किया जाता है। कई तरीकों को साबित करना संभव है। जैसे ट्रेल (पुनः) प्रोफाइलर में घटनाओं को संकलित करें, योजना कैशिंग डीएमवी देखें। [मेरा जवाब यहां] (http://stackoverflow.com/questions/19884138/why-sql-functions-are-faster-than-udf/19891697#19891697) यूडीएफ को कई बार निष्पादित करते समय स्टैक निशान को देखता है। ओवरहेड निष्पादन के दौरान संकलन नहीं है। –

+0

किस प्रकार का फ़ंक्शन - स्केलर या इनलाइन टेबल-मूल्यवान या बहु-कथन तालिका-मूल्यवान?तीन विभिन्न निष्पादन तंत्र के साथ विभिन्न प्रकार के ऑब्जेक्ट्स हैं (इनलाइन टीवीएफ इनलाइन हैं, उदाहरण के लिए :-)। –

उत्तर

5

@mhasan, आपके प्रश्न में मेरे ब्लॉग-पोस्ट का जिक्र करने के लिए धन्यवाद।

जहाँ तक एक मैं संग्रहित प्रक्रियाओं & कार्य पता दोनों संकलन & रखता के मामले में समान व्यवहार किया है। दोनों पूर्व संकलित नहीं हैं। जब आप उनमें से किसी एक को बनाते हैं तो उन्हें सिर्फ पार्स और बनाया जाता है, लेकिन संकलित नहीं किया जाता है। दोनों को संकलित किया जाता है जब उन्हें पहली बार निष्पादित किया जाता है। और यदि उन्हें कोई भी बदलाव लागू होता है तो उन्हें फिर से फिर से संकलित किया जा सकता है।

निम्न क्वेरी निष्पादित आप एक नया कार्य बनाने के बाद:

SELECT objtype, cacheobjtype, usecounts, text 
FROM sys.dm_exec_cached_plans AS p 
     CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t 
WHERE t.text LIKE '%YourNewFunctionName%' 

आप केवल एक रिकॉर्ड है, जिनमें से संकलित योजना है देखेंगे कि इस प्रश्न के ही है, यानी एक Adhoc वस्तु प्रकार के लिए।

फ़ंक्शन निष्पादित करने के बाद इस क्वेरी को फिर से निष्पादित करें। आप फंक्शन की संकलित योजना सहित अधिक रिकॉर्ड देखेंगे, जिसमें ऑब्जेक्ट-टाइप प्रो है।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद मानओज भाई .. मैंने आपके ब्लॉग को बुकमार्क किया है ... वहां से बहुत कुछ सीखेंगे। –

+0

धन्यवाद हसन, आपको मेरे पाठक के रूप में रखना पसंद करेंगे। –

4

यह एक अजीब बयान है और जहां तक ​​मुझे पता है कि यूडीएफ और एसपी संकलित हैं (और जब यह बदलते हैं तो पुन: संकलित) समान रूप से। यह आपको गतिशील (गैर पैरामीट्रिक) प्रश्नों के साथ साक्षात्कारकर्ता मिश्रित यूडीएफ दिखाई देता है। अगर किसी को उस तर्क को बनाए रखने के लिए थोड़ी सी जानकारी मिलती है तो कृपया इसकी रिपोर्ट करें।

+0

जोड़ने के लिए, Yal Scalar UDF धीमा हो सकता है और इसके बारे में एक अच्छा व्याख्यान यह आलेख और अनुवर्ती चर्चा है। http://www.sqlservercentral.com/articles/T-SQL/91724/ – jean

3

जीन सही है कि वे निश्चित रूप से एक बार संकलित किए जाते हैं।

बाद क्वेरी आप प्रक्रिया कैश दे देंगे और इस तरह के निष्पादन गिनती के रूप में उपयोगी मीट्रिक में शामिल, पढ़ता है, आदि:

SELECT TOP 1000 DB_NAME(qt.dbid)           AS DB, 
       OBJECT_NAME(qt.objectid, qt.dbid)      AS 'object_name', 
       qs.total_worker_time, 
       qs.execution_count, 
       qs.total_logical_reads, 
       plan_generation_num, 
       SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1, 
            ((CASE statement_end_offset 
              WHEN -1 THEN DATALENGTH(qt.text) 
              ELSE qs.statement_end_offset 
              END - qs.statement_start_offset)/2) + 1) AS 'query' 
FROM sys.dm_exec_query_stats AS qs 
     CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt 
     LEFT JOIN sys.objects o 
     ON o.object_id = qt.objectid 
WHERE qs.execution_count > 0 
     AND DATEDIFF(Second, qs.creation_time, GETDATE()) > 0 
     AND DATEDIFF(Minute, qs.creation_time, GETDATE()) > 0 
ORDER BY /*Sort functions first*/ 
      CASE 
      WHEN o.type_desc LIKE '%FUNCTION' THEN 0 
      ELSE 1 
      END, 
      qs.execution_count DESC 

रिपोर्ट मैं से 1. उच्च गिनती एक निष्पादन के साथ कार्यों में देखने के लिए कर रहा हूँ में दूसरे शब्दों में मौजूदा निष्पादन योजना का पुन: उपयोग किया जाता है। संग्रहित प्रक्रियाओं के समान व्यवहार।

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