8

मैंने एक टेबल-मूल्यवान यूडीएफ लिखा है जो एक बड़ी तालिका से पंक्तियों का सबसेट लौटने के लिए सीटीई द्वारा शुरू होता है। सीटीई में कई शामिल हैं। कुछ आंतरिक और एक बाएं अन्य तालिकाओं में शामिल हो गए, जिनमें बहुत सारी पंक्तियां नहीं हैं। सीटीई में एक ऐसा खंड है जो केवल पंक्तियों को वापस करने के लिए पंक्तियों के भीतर पंक्तियों को लौटाता है।एसक्यूएल सर्वर सीटीई में स्वयं को शामिल किया गया धीमा

मैं विभिन्न मानदंडों का उपयोग करके उप-योग बनाने के लिए, 4 स्वयं बाएं जुड़ने में इस सीटीई का संदर्भ दे रहा हूं।

क्वेरी काफी जटिल है, लेकिन यहाँ यह की एक सरल छद्म संस्करण

WITH DataCTE as 
(
    SELECT [columns] FROM table 
         INNER JOIN table2 
         ON [...] 

         INNER JOIN table3 
         ON [...] 

         LEFT JOIN table3 
         ON [...] 
) 
SELECT [aggregates_columns of each subset] FROM DataCTE Main 
LEFT JOIN DataCTE BananasSubset 
       ON [...] 
      AND Product = 'Bananas' 
      AND Quality = 100 
LEFT JOIN DataCTE DamagedBananasSubset 
       ON [...] 
      AND Product = 'Bananas' 
      AND Quality < 20 
LEFT JOIN DataCTE MangosSubset 
       ON [...] 
GROUP BY [ 

मैं महसूस कर रही है कि एसक्यूएल सर्वर भ्रमित हो जाता है और शामिल होने के प्रत्येक स्वयं के लिए CTE, जो को देखकर इस बात की पुष्टि लगता है कॉल निष्पादन योजना, हालांकि मैं उनको पढ़ने में एक विशेषज्ञ नहीं मानता हूं।

मैं एसक्यूएल सर्वर को केवल कई बार करने के बजाय केवल एक बार सीटीई से डेटा पुनर्प्राप्ति करने के लिए पर्याप्त स्मार्ट होने के लिए मानता।

मैंने डेटा के सबसेट प्राप्त करने के लिए एक सीटीई का उपयोग करने के बजाय एक ही दृष्टिकोण की कोशिश की है, मैंने सीटीई में समान चयन क्वेरी का उपयोग किया, लेकिन इसके बजाय इसे एक टेम्पलेट तालिका में आउटपुट किया।

सीटीई संस्करण का संदर्भ देने वाला संस्करण 40 सेकंड लेता है। अस्थायी तालिका का जिक्र करने वाला संस्करण 1 से 2 सेकंड के बीच आता है।

SQL सर्वर को सीटीई परिणामों को स्मृति में रखने के लिए पर्याप्त स्मार्ट क्यों नहीं है?

मुझे सीटीई पसंद है, खासकर इस मामले में क्योंकि मेरा यूडीएफ एक टेबल-मूल्यवान है, इसलिए यह मुझे सबकुछ एक ही कथन में रखने की इजाजत देता है।

एक temp तालिका का उपयोग करने के लिए, मुझे एक बहु-कथन तालिका मूल्यवान यूडीएफ लिखनी होगी, जिसे मुझे थोड़ा कम सुरुचिपूर्ण समाधान मिल जाएगा।

क्या आप में से कुछ ने सीटीई के साथ इस तरह के प्रदर्शन मुद्दों को किया था, और यदि हां, तो आप उन्हें कैसे हल कर चुके थे?

धन्यवाद,

Kharlos

+0

क्या आप अपनी निष्पादन योजना पोस्ट कर सकते हैं? –

उत्तर

6

मुझे विश्वास है कि CTE परिणाम हर बार प्राप्त किए गए हैं। एक temp तालिका के साथ परिणाम गिराए जाने तक संग्रहीत किया जाता है। यह आपके द्वारा देखी गई प्रदर्शन लाभों को समझाएगा जब आपने एक अस्थायी तालिका में स्विच किया था।

एक और लाभ यह है कि आप एक अस्थायी तालिका पर इंडेक्स बना सकते हैं जिसे आप सीटीई के साथ नहीं कर सकते हैं। सुनिश्चित नहीं है कि आपकी स्थिति में कोई फायदा होगा या नहीं, लेकिन यह जानना अच्छा है।

संबंधित पढ़ने:

CTE की अंतर्निहित क्वेरी होगा: पिछले लिंक से

उद्धरण प्रत्येक बार इसे तत्काल निम्नलिखित क्वेरी में संदर्भित किया जाता है।

मैं कहूंगा कि temp तालिका के साथ जाना होगा। दुर्भाग्य से सुरुचिपूर्ण हमेशा सबसे अच्छा समाधान नहीं है।

अद्यतन:

हममम कि चीजें और अधिक कठिन बना देता है। मेरे पूरे पर्यावरण को देखने के लिए मेरे साथ कहना मुश्किल है।

कुछ विचार:

  • आप एक यूडीएफ (बजाय, भीतर से नहीं) के बजाय एक संग्रहीत प्रक्रिया का उपयोग कर सकते हैं?
  • यह संभव नहीं हो सकता है लेकिन यदि आप सीटीई से left join हटा सकते हैं तो आप इसे अनुक्रमित दृश्य में ले जा सकते हैं। यदि आप ऐसा करने में सक्षम हैं तो आप अस्थायी तालिका पर भी प्रदर्शन लाभ देख सकते हैं।
+0

इन महान संदर्भों के लिए बहुत बहुत धन्यवाद। मैं यही मानता हूं ... जैसा कि आप कहते हैं, मुझे इस यूडीएफ को 40 सेकंड लेने का विकल्प नहीं है, मुझे लालित्य छोड़ना होगा। मुझे उम्मीद है कि इसे SQL सर्वर के अगले संस्करण में अनुकूलित किया जा रहा है हालांकि ... तब तक, मैं शायद सीटीई से बचने के लिए ... कम से कम, एक अस्थायी तालिका के साथ, मैं और अधिक महसूस कर सकता हूं दृश्यों के पीछे क्या चल रहा है इसका नियंत्रण। फिर से धन्यवाद। –

+0

अरग ... मैं भूल गया था कि यहां तक ​​कि बहुस्तरीय यूडीएफ अस्थायी तालिकाओं का उपयोग नहीं कर सकता है। मैंने इसके बजाय तालिका चर का उपयोग करने का प्रयास किया है, लेकिन प्रदर्शन बिल्कुल भयानक है ... सीटीई संस्करण की तुलना में भी बदतर ... मेरा डेटा सबसेट लगभग 10 000 पंक्तियां है, लेकिन 100,000 तक जा सकता है उपयोगकर्ता। मेरे अन्य विकल्प क्या हैं जिन पर विचार है कि कॉलर को टेबल के रूप में अपना डेटा वापस करने के लिए * है। धन्यवाद। –

+0

मेरा अपडेट देखें। दुर्भाग्य से मुझे लगता है कि उनमें से कोई भी आपके लिए काम नहीं करेगा। –