6

के रूप में सहेजा गया है, तो मुझे लगता है कि SQL सर्वर एक आईटीवीएफ में अपना कोड लपेटते समय पूरी तरह से अलग निष्पादन योजना क्यों ले रहा है। आईटीवीएफ के अंदर कोड चलाते समय, क्वेरी 5 सेकंड में चलती है। अगर मैं इसे आईटीवीएफ के रूप में सहेजता हूं, तो यह 20 मिनट तक चलता है और नतीजा नहीं देता है। कोड कोड पुन: उपयोग के लिए मैं इसे आईटीवीएफ में रखना पसंद करूंगा। किसी भी विचार से आईटीवीएफ के रूप में कोड को सहेजने से गंभीर प्रदर्शन के मुद्दे क्यों होंगे?टी-एसक्यूएल कोड बेहद धीमा है जब इनलाइन टेबल-मूल्यवान फ़ंक्शन

CREATE FUNCTION myfunction 
(
    @start_date date, 
    @stop_date date 
) 
RETURNS TABLE 
AS 
RETURN 
(
    with 
    ad as (
     select [START_DATE] 
       ,[STOP_DATE] 
       ,ID 
       ,NAME 
       ,'domain1\' + lower(DOMAIN1_NAME) 
       collate database_default as ad_name 
     from EMP_INFO 
     where DOMAIN1_NAME != '' 
     union 
     select [START_DATE] 
       ,[STOP_DATE] 
       ,ID 
       ,NAME 
       ,'domain2\' + lower(DOMAIN2_NAME) 
       collate database_default as ad_name 
     from EMP_INFO 
     where DOMAIN2_NAME != '' 
    ) 
    select ad.ID 
      ,ad.NAME 
      ,COUNT(*) as MONITORS 
    from scores 
    join users 
     on (scores.evaluator_id = users.[user_id]) 
    join ad 
     on (lower(users.auth_login) = ad.ad_name and 
      scores.[start_date] between ad.[START_DATE] and ad.[STOP_DATE]) 
    where scores.[start_date] between @start_date and @stop_date 
    group by ad.ID 
      ,ad.NAME 
) 

संपादित करें:

ठीक है ... मुझे लगता है कि मैं इस समस्या पता लगा ... लेकिन मैं यह समझ में नहीं आता। संभवतः मुझे एक बिल्कुल नया सवाल पोस्ट करना चाहिए, मुझे बताएं कि आप क्या सोचते हैं। यहां मुद्दा यह है कि जब मैं फ़ंक्शन को फ़ंक्शन के साथ कॉल करता हूं, तो यह वास्तव में धीमा होता है ... जब मैं इसे चर के साथ कॉल करता हूं तो यह तेज़ होता है।

-- Executes in about 3 seconds 
declare @start_date date = '2012-03-01'; 
declare @stop_date date = '2012-03-31'; 
select * 
from myfunction(@start_date, @stop_date); 

--Takes forever! Never completes execution... 
select * 
from myfunction('2012-03-01', '2012-03-31') 

कोई विचार?

+0

शुरुआत '(कम (users.auth_login) = ad.ad_name' के लिए मार किया जा सकता है चालू गैर SARGable है – SQLMenace

+0

अच्छा! नहीं था एसएआरजी से परिचित, अच्छी जानकारी। मैंने निचले() फ़ंक्शन को हटा दिया है और मुझे अभी भी एक ही समस्या है। असल में, मैंने तर्क को एक दृश्य में अलग कर दिया है, कुल भाग को हटा दिया है, और मैं कुल कर सकता हूं दृश्य पर काम करें। लेकिन एक बार फिर, अगर मैं किसी फ़ंक्शन में उस दृश्य को लपेटता हूं, तो मुझे एक ही समस्या मिलती है ... – pyrospade

+0

क्या आप इनलाइन और गैर-इनलाइन निष्पादन योजना पोस्ट कर सकते हैं? – EBarr

उत्तर

5

जब आप अक्षर का उपयोग करते हैं तो SQL सर्वर कॉलम आंकड़ों को देख सकता है कि अनुमान लगाने के लिए कि कितनी पंक्तियां वापस की जाएंगी और उस धारणा के आधार पर उचित योजना चुनें। जब आप चर का उपयोग करते हैं तो मान संकलन समय पर ज्ञात नहीं होते हैं, इसलिए यह अनुमानों पर वापस आ जाता है।

यदि वास्तविक आंकड़ों को संदर्भित करते समय यह अनुमान बेहतर होता है तो यह इंगित करता है कि आंकड़ों को संभावित रूप से अद्यतन करने की आवश्यकता है।

यदि आपके पास आँकड़ों के ऑटो अपडेट तो आप अच्छी तरह से इस मुद्दे को यहाँ Statistics, row estimations and the ascending date column

+1

वाह, कभी अनुमान लगाया नहीं होगा। अच्छी जानकारी! जैसे ही मुझे प्रतिष्ठा मिलती है, उतनी ही वोट देगी! – pyrospade