10

क्वेरी संस्करण 2 इतना तेज़ क्यों है?जब मैं (मैन्युअल रूप से) एक अस्थायी तालिका में तालिका-मूल्यवान फ़ंक्शन के परिणामों को कैश करता हूं तो कोई क्वेरी इतनी तेज क्यों होती है?

मुझे संदेह है कि डीबी इंजन तालिका-मूल्यवान-फ़ंक्शन "GetUsageStatistic" को कई बार कॉल कर रहा है, तो क्या इंजन को यह बताने का कोई तरीका है कि "GetUsageStatistic" निर्धारक है और इसे केवल एक बार बुलाया जाना चाहिए?

क्वेरी संस्करण 1

--Takes ~10 minutes 
select * 
from RosterLevel r 
left join GetUsageStatistics(@mindate, @maxdate) usage on r.UserID = usage.UserID; 

क्वेरी संस्करण 2

--Takes ~10 seconds 
select * into #usage from GetUsageStatistics(@mindate, @maxdate); 
select * 
from RosterLevel r 
left join #usage on r.UserID = #usage.UserID; 
+0

'GetUsageStatistics' का शरीर कैसा दिखता है? क्या यह एक प्रश्न है, या एकाधिक प्रश्नों को एक परिणाम के लिए अग्रणी है? –

+0

GetUsageStatistics एक इनलाइन-टेबल-मूल्यवान-फ़ंक्शन (आईटीवीएफ) है, जो GetWeeklyUsage से चुनता है, जो स्वयं एक आईटीवीएफ है जो GetDailyUsage (एक आईटीवीएफ) से भी चयन करता है। यह मूल रूप से निर्धारक आईटीवीएफ की एक साधारण श्रृंखला है कि प्रत्येक अपने आउटपुट कॉलम में एसयूएम, एवीजी, और COUNT कार्यों के साथ कुल परिणामों का स्तर लौटाता है। – Triynko

+0

@Triynko - निश्चित रूप से दोनों प्रश्नों के लिए वास्तविक निष्पादन योजनाएं प्राप्त करने और उन्हें देखने के लिए तुलना करना कि टीवीएफ सिद्धांत का आपका बहु-निष्पादन सही है या नहीं। –

उत्तर

1

टिप्पणी में उल्लेख किया है, सबसे अच्छा जवाब का विश्लेषण करने के लिए जो भी कार्य योजना लागू करके थूक से बाहर किया जाता है। इसे छोड़कर, आपका अंतर्ज्ञान संभवतः सही है, लेकिन एसक्यूएल सर्वर जो भी कैशिंग है, उसके अलावा स्वचालित रूप से प्रयास करने के अलावा, क्वेरी संकेतों के रास्ते में मेरे सिर पर बहुत कुछ नहीं आ रहा है, यह इंगित करने के लिए कि यह कार्य निर्धारित है, लेकिन आपका प्रयास करने के लिए आपका स्वागत है Query Hints MSDN page में उल्लिखित कुछ चीजें। मेरा पहला परीक्षण शायद Table Hints पर आकर्षित होगा।

+0

टैग "एसक्यूएल" एक माइक्रोसॉफ्ट टैग है? – Tim

+1

@ टिम: नहीं। फिर भी बहुत से लोग इसे ऐसा करने के लिए गलती करते हैं, वास्तव में। SQL सर्वर मानने का एक अन्य कारण यह हो सकता है कि ओपी की स्क्रिप्ट स्पष्ट रूप से टी-एसक्यूएल ('#' -नाम से) है। लेकिन शायद वास्तविक कारण यह है कि ओपी ने अपनी टिप्पणियों में से एक में एसएसएमएस का उल्लेख किया है। –

+0

@Tim: @Andriy तरह का अधिकार - 'स्पष्ट' विषय हालांकि है, क्योंकि यह केवल उन लोगों पर लागू होता है जो पहले ही जानते हैं कि टीएसक्यूएल कैसा दिखता है, और एसएसएमएस एमएस है। लेकिन इस तरह के snobbery अलग :-), आप सही हैं, यह एक सामान्य एसक्यूएल सवाल नहीं है, यह एक टीएसक्यूएल सवाल है, और इससे कोई फर्क पड़ता है जहां तक ​​इसका जवाब दे सकता है, और इसे पढ़ने/पढ़ने में रुचि रखने में कौन दिलचस्पी लेगा यह पहली जगह में है। – Chains

0

यदि आप अपने पहले उदाहरण में फ़ंक्शन का उपयोग करते हैं, तो इसे कई बार कहा जाता है - एक बार आपके रोस्टरलेवल तालिका में प्रत्येक रिकॉर्ड के लिए। यह शामिल फ़ील्ड के आधार पर हर बार एक (संभावित रूप से) अलग-अलग तालिका देता है।

यदि आप अपने दूसरे उदाहरण में फ़ंक्शन का उपयोग करते हैं, तो इसे केवल एक बार बुलाया जाता है। वहां से, तालिका चर मेमोरी में है, और आपको पढ़ने के लिए और अधिक नहीं करना है।