12

मेरे पास एक जटिल क्वेरी है जिसे मुझे बाद की क्वेरी (वास्तव में अद्यतन कथन) में उपयोग करने की आवश्यकता है। मैंने सीटीई और एक अस्थायी तालिका दोनों का उपयोग करने की कोशिश की है। सीटीई का उपयोग कर प्रदर्शन अस्थायी बनाम temp तालिका दृष्टिकोण है। यह 15 सेकंड बनाम मिलीसेकंड की तरह कुछ है। बाद की क्वेरी में सीटीई/टेम्प तालिका में शामिल होने के बजाय परीक्षण को सरल बनाने के लिए मैंने बस इसे * से चुना है। उस मामले में वे वही प्रदर्शन करते हैं।एसक्यूएल 2005 सीटीई बनाम टीईएमपी तालिका प्रदर्शन जब अन्य तालिकाओं के जुड़ने में उपयोग किया जाता है

मैंने बाद के प्रश्न में शामिल होने के साथ दोनों दृष्टिकोणों के लिए निष्पादन योजना को देखा है और फिर बस * चुनें। सरल चयन के साथ क्वेरी योजनाएं समान हैं, लेकिन बाद में शामिल होने के साथ क्वेरी योजनाएं नहीं हैं। विशेष रूप से temp तालिका बनाने और पॉप्युलेट करने के लिए क्वेरी प्लान का हिस्सा वही रहता है, जबकि सीटीई बनाने और पॉप्युलेट करने के लिए क्वेरी प्लान भाग नाटकीय रूप से बदलता है जब इसे बाद में किसी क्वेरी में उपयोग किया जाता है।

मेरा प्रश्न यह है कि सीटीई की सृजन और आबादी के लिए क्वेरी योजना क्यों बदलती है जब इसका उपयोग बाद में किया जाता है जबकि अस्थायी तालिका नहीं होती है। इसके अलावा किस परिदृश्य में सीटीई एक अस्थायी तालिका की तुलना में बेहतर प्रदर्शन करेगा?

* नोट मैंने टेबल सारणी का भी उपयोग किया है और यह temp तालिका दृष्टिकोण से तुलनीय है।

धन्यवाद

उत्तर

9

आप एक जटिल सवाल पूछ रहे हैं, इसलिए आपको एक जटिल जवाब मिल रहा है: यह निर्भर करता है। (मुझे उस प्रतिक्रिया से नफरत है)।

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

सीटीई को पुन: प्रयोज्यता और रखरखाव के मुद्दों के लिए लागू किया गया था, जरूरी नहीं कि प्रदर्शन; हालांकि, कई मामलों में (रिकर्सन की तरह), वे पारंपरिक कोडिंग विधियों से बेहतर प्रदर्शन करेंगे।

13

CTE बस क्वेरी के लिए एक उपनाम है।

यह हर बार उपयोग होने पर (या नहीं) पुन: चालू हो सकता है।

(Oracle की /*+ MATERIALIZE */ की तरह) SQL Server में CTE भौतिकीकरण मजबूर करने के लिए कोई साफ तरीका नहीं है, और आप इस तरह गंदा चाल क्या करना है:

CTE प्रदर्शन बेहतर हो सकता है, तो इस्तेमाल किया योजनाओं में केवल एक मूल्यांकन की आवश्यकता होती है (जैसे HASH JOIN, MERGE JOIN इत्यादि)।

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

+1

भौतिक बनाने के लिए हाँ! परिभाषा में एक पीके/आईएक्स अच्छा हो सकता है। – crokusek

2

मुझे लगता है कि आम तौर पर दोहराए गए सीटीई में कोई प्रदर्शन सुधार नहीं होता है।

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

सीटीई के बजाय, मैं अक्सर इनलाइन टीवीएफ (जिसमें सीटीई हो सकता है) का उपयोग करता है, जो उचित पुन: उपयोग की अनुमति देता है, और मेरे एसपी में सीटीई से बेहतर या बुरा नहीं है।

इसके अलावा, मुझे यह भी पता चलता है कि निष्पादन योजना खराब हो सकती है यदि पहला चरण आंकड़ों को बदल देता है जैसे कि दूसरे चरण के लिए निष्पादन योजना हमेशा गलत होती है क्योंकि किसी भी चरण से पहले इसका मूल्यांकन किया जाता है।

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

0

मैंने बड़ी तालिका से फिल्टर के साथ चयनित सीटीई बनाने की कोशिश की तो 3 बार इसे कम किया गया।

इसके बाद अस्थायी तालिकाओं के साथ ऐसा ही करें।

परिणाम टेम्पलेट तालिका के लिए सीटीई -30% समय लेने के लिए 70% समय लेने वाला था। तो अस्थायी तालिका उन समाधानों के लिए बेहतर है।

मुझे नहीं लगता कि सीटीई केवल चयनित क्वेरी के साथ एक temp तालिका बनाता है, लेकिन 3 बार एक बड़ी तालिका में चयन करते हैं।

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