Database
 sql >> डेटाबेस >  >> RDS >> Database

क्या आप क्रमबद्ध हैं? टी-एसक्यूएल विंडो ऑर्डरिंग से संबंधित टिप्स

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

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

ऐसी परिस्थितियों में, आप आमतौर पर स्वीकार करेंगे कि योजना में स्पष्ट छँटाई अपरिहार्य है। आप पा सकते हैं कि क्वेरी में भावों की वाक्यात्मक व्यवस्था कितने . को प्रभावित कर सकती है स्पष्ट सॉर्ट ऑपरेटर आपको योजना में मिलते हैं। कुछ बुनियादी युक्तियों का पालन करके आप कभी-कभी स्पष्ट सॉर्ट ऑपरेटरों की संख्या को कम कर सकते हैं, जो निश्चित रूप से, क्वेरी के प्रदर्शन पर एक बड़ा प्रभाव डाल सकते हैं।

डेमो के लिए पर्यावरण

मेरे उदाहरणों में, मैं नमूना डेटाबेस PerformanceV5 का उपयोग करूँगा। आप यहां इस डेटाबेस को बनाने और भरने के लिए स्रोत कोड डाउनलोड कर सकते हैं।

मैंने SQL सर्वर 2019 डेवलपर पर सभी उदाहरण चलाए, जहां रोस्टोर पर बैच-मोड उपलब्ध है।

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

SQL सर्वर वर्तमान में समानांतर बैच-मोड विंडो एग्रीगेट ऑपरेटर से पहले समानांतर ऑर्डर-संरक्षण इनपुट के कुशल संयोजन का समर्थन नहीं करता है। इसलिए, समानांतर बैच-मोड विंडो एग्रीगेट ऑपरेटर का उपयोग करने के लिए, ऑप्टिमाइज़र को एक मध्यस्थ समानांतर बैच-मोड सॉर्ट ऑपरेटर को इंजेक्ट करना पड़ता है, तब भी जब इनपुट पहले से ही प्रीऑर्डर किया गया हो।

सादगी के लिए, आप इस लेख में दिखाए गए सभी उदाहरणों में समानता को रोक सकते हैं। सभी प्रश्नों में संकेत जोड़ने की आवश्यकता के बिना इसे प्राप्त करने के लिए, और सर्वर-व्यापी कॉन्फ़िगरेशन विकल्प सेट किए बिना, आप डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प MAXDOP सेट कर सकते हैं। करने के लिए 1 , इस तरह:

प्रदर्शन का उपयोग करेंV5; वैकल्पिक डेटाबेस स्कोप्ड कॉन्फ़िगरेशन सेट MAXDOP =1;

इस आलेख में उदाहरणों का परीक्षण करने के बाद इसे वापस 0 पर सेट करना याद रखें। मैं आपको अंत में याद दिलाऊंगा।

वैकल्पिक रूप से, आप गैर-दस्तावेजी DBCC OPTIMIZER_WHATIF के साथ सत्र स्तर पर समानता को रोक सकते हैं। आदेश, जैसे:

DBCC OPTIMIZER_WHATIF(CPUs, 1);

जब आप काम पूरा कर लें तो विकल्प को रीसेट करने के लिए, इसे सीपीयू की संख्या के रूप में 0 मान के साथ फिर से लागू करें।

जब आप समानांतरवाद अक्षम के साथ इस लेख के सभी उदाहरणों को आज़माना समाप्त कर लेते हैं, तो मेरा सुझाव है कि समानांतरवाद को सक्षम करें और सभी उदाहरणों को फिर से आज़माकर देखें कि क्या परिवर्तन होते हैं।

टिप्स 1 और 2

सुझावों के साथ शुरू करने से पहले, आइए सबसे पहले एक विंडो फ़ंक्शन के साथ एक सरल उदाहरण देखें, जिसे supp class="border इंडेंट शैडो ऑर्टिंग इंडेक्स से लाभ उठाने के लिए डिज़ाइन किया गया है।

निम्नलिखित प्रश्न पर विचार करें, जिसे मैं प्रश्न 1 के रूप में संदर्भित करूंगा:

सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (ऑर्डर डेट के अनुसार कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 1 के रूप में। ऑर्डर;

इस तथ्य के बारे में चिंता न करें कि उदाहरण का आविष्कार किया गया है। कुल ऑर्डर आईडी की गणना करने के लिए कोई अच्छा व्यावसायिक कारण नहीं है—यह तालिका 1MM पंक्तियों के साथ शालीनता से आकार की है, और मैं एक सामान्य विंडो फ़ंक्शन के साथ एक सरल उदाहरण दिखाना चाहता था जैसे कि एक रनिंग कुल गणना को लागू करता है।

POC अनुक्रमण योजना के बाद, आप क्वेरी का समर्थन करने के लिए निम्न अनुक्रमणिका बनाते हैं:

अद्वितीय गैर-अनुक्रमित अनुक्रमणिका बनाएं idx_nc_cid_od_oid ON dbo.Orders(Custid, orderdate, orderid);

इस क्वेरी की योजना चित्र 1 में दिखाई गई है।

चित्र 1:प्रश्न 1 के लिए योजना

यहां कोई आश्चर्य नहीं है। यह योजना आपके द्वारा अभी बनाए गए इंडेक्स का इंडेक्स ऑर्डर स्कैन लागू करती है, जो विंडो एग्रीगेट ऑपरेटर को ऑर्डर किया गया डेटा प्रदान करती है, बिना स्पष्ट सॉर्टिंग की आवश्यकता के।

इसके बाद, निम्न क्वेरी पर विचार करें, जिसमें विभिन्न ऑर्डरिंग आवश्यकताओं के साथ कई विंडो फ़ंक्शन शामिल हैं, साथ ही साथ एक प्रस्तुति ORDER BY क्लॉज:

सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरिड आरओडब्ल्यूएस अनबाउंडेड प्रीसिडिंग द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन) योग 2 के रूप में, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरडेट के अनुसार ऑर्डर द्वारा ऑर्डर, ऑर्डरिड पंक्तियों को अनबाउंड किया गया) 1 के रूप में, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 3 के रूप में। कस्टिड द्वारा ऑर्डर ऑर्डर, ऑर्डरिड;

मैं इस क्वेरी को क्वेरी 2 के रूप में संदर्भित करूंगा। इस क्वेरी की योजना चित्र 2 में दिखाई गई है।

चित्र 2:क्वेरी 2 के लिए योजना

ध्यान दें कि योजना में चार सॉर्ट ऑपरेटर हैं।

यदि आप विभिन्न विंडो फ़ंक्शंस और प्रेजेंटेशन ऑर्डरिंग आवश्यकताओं का विश्लेषण करते हैं, तो आप पाएंगे कि तीन अलग-अलग ऑर्डरिंग ज़रूरतें हैं:

  • कस्टिड, ऑर्डरडेट, ऑर्डरिड
  • ऑर्डरिड
  • कस्टिड, ऑर्डरिड

उनमें से एक को देखते हुए (उपरोक्त सूची में पहला) आपके द्वारा पहले बनाए गए इंडेक्स द्वारा समर्थित हो सकता है, आप योजना में केवल दो प्रकार देखने की उम्मीद करेंगे। तो, योजना चार प्रकार की क्यों है? ऐसा लगता है कि SQL सर्वर प्रकार को कम करने के लिए योजना में कार्यों के प्रसंस्करण क्रम को पुनर्व्यवस्थित करने के साथ बहुत परिष्कृत होने की कोशिश नहीं करता है। यह योजना में कार्यों को उस क्रम में संसाधित करता है जिस क्रम में वे क्वेरी में दिखाई देते हैं। कम से कम प्रत्येक विशिष्ट ऑर्डरिंग आवश्यकता की पहली घटना के लिए यह मामला है, लेकिन मैं जल्द ही इस पर विस्तार से बताऊंगा।

आप निम्न दो सरल प्रथाओं को लागू करके योजना में कुछ प्रकार की आवश्यकता को दूर कर सकते हैं:

युक्ति 1:यदि आपके पास क्वेरी में कुछ विंडो फ़ंक्शन का समर्थन करने के लिए एक अनुक्रमणिका है, तो पहले उन्हें निर्दिष्ट करें।

टिप 2:यदि क्वेरी में उसी क्रम की आवश्यकता वाले विंडो फ़ंक्शन शामिल हैं, जो क्वेरी में प्रस्तुतीकरण क्रम के रूप में हैं, तो उन कार्यों को अंतिम रूप से निर्दिष्ट करें।

इन युक्तियों का पालन करते हुए, आप क्वेरी में विंडो फ़ंक्शंस के प्रकटन क्रम को इस प्रकार पुनर्व्यवस्थित करते हैं:

सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (कस्टिड ऑर्डर द्वारा ऑर्डरडेट द्वारा ऑर्डर, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) योग 1, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) योग 3 के रूप में (ऑर्डरिड) ओवर (कस्टिड द्वारा पार्टिशन ऑर्डर द्वारा ऑर्डरिड पंक्तियों अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 2 के रूप में। कस्टिड, ऑर्डरिड द्वारा ऑर्डर;

मैं इस क्वेरी को क्वेरी 3 के रूप में संदर्भित करूंगा। इस क्वेरी की योजना चित्र 3 में दिखाई गई है।

चित्र 3:क्वेरी 3 के लिए योजना

जैसा कि आप देख सकते हैं, योजना अब केवल दो प्रकार की है।

टिप 3

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

एक उदाहरण के रूप में निम्नलिखित प्रश्न पर विचार करें:

सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (कस्टिड ऑर्डर द्वारा ऑर्डरडेट द्वारा ऑर्डर, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) योग 1, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) योग 3 के रूप में (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन अनबाउंडेड प्रीसीडिंग) योग 2 के रूप में, MAX (ऑर्डरिड) ओवर (ऑर्डर द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीक्यूनिंग) मैक्स 1, मैक्स (ऑर्डर बाय ऑर्डर) ओवर (ऑर्डरिड द्वारा ऑर्डर) ओवर (ऑर्डरिड द्वारा ऑर्डर) PRECEDING) अधिकतम 3 के रूप में, MAX (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन अनबाउंडेड प्रीसिडिंग) अधिकतम 2 के रूप में, औसत (ऑर्डरिड) ओवर (ऑर्डर द्वारा कस्टिड ऑर्डर द्वारा ऑर्डर दिनांक, * ऑर्डरिड पंक्तियाँ अनबाउंडेड औसत 1, ऑर्डर आईडी के रूप में ) ओवर (ऑर्डर द्वारा ऑर्डर की गई पंक्तियाँ अनबाउंडेड प्रीसिडिंग) एवीजी 3 के रूप में, एवीजी (ऑर्डरिड) ओवर (कस्टिड ऑर्डर द्वारा ऑर्डरिड पंक्तियों अनबाउंडेड प्रीसिडिंग द्वारा पार्टिशन) डीबीओ से एवीजी 2 के रूप में। कस्टिड द्वारा ऑर्डर; 

मैं इस क्वेरी को क्वेरी 4 के रूप में संदर्भित करूंगा। इस क्वेरी की योजना चित्र 4 में दिखाई गई है।

चित्र 4:क्वेरी 4 के लिए योजना

समान ऑर्डरिंग आवश्यकताओं वाले विंडो फ़ंक्शन को क्वेरी में एक साथ समूहीकृत नहीं किया जाता है। हालाँकि, योजना में अभी भी केवल दो प्रकार हैं। ऐसा इसलिए है क्योंकि योजना में प्रसंस्करण आदेश के संदर्भ में जो मायने रखता है वह प्रत्येक विशिष्ट आदेश की आवश्यकता की पहली घटना है। यह मुझे तीसरे टिप की ओर ले जाता है।

टिप 3:प्रत्येक विशिष्ट ऑर्डरिंग आवश्यकता की पहली घटना के लिए टिप्स 1 और 2 का पालन करना सुनिश्चित करें। समान आदेश देने की आवश्यकता के बाद की घटनाएं, भले ही असंबद्ध हों, की पहचान की जाती है और उन्हें पहले के साथ समूहीकृत किया जाता है।

टिप्स 4 और 5

मान लीजिए कि आप आउटपुट में एक निश्चित बाएं से दाएं क्रम में विंडो गणनाओं के परिणामस्वरूप कॉलम वापस करना चाहते हैं। लेकिन क्या होगा यदि ऑर्डर उस ऑर्डर के समान नहीं है जो योजना में कम से कम सॉर्ट करेगा?

उदाहरण के लिए, मान लीजिए कि आप आउटपुट में बाएं से दाएं कॉलम ऑर्डर के संदर्भ में क्वेरी 2 द्वारा उत्पादित एक ही परिणाम चाहते हैं (कॉलम ऑर्डर:अन्य कॉलम, योग 2, योग 1, योग 3), लेकिन आप इसके बजाय वही योजना जो आपको क्वेरी 3 के लिए मिली थी (स्तंभ क्रम:अन्य कॉलम, योग 1, योग 3, योग 2), जिसे चार के बजाय दो प्रकार मिले।

यदि आप चौथी युक्ति से परिचित हैं तो यह पूरी तरह से संभव है।

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

निम्नलिखित प्रश्न, जिसे मैं प्रश्न 5 के रूप में संदर्भित करूंगा, इस तकनीक को दिखाता है:

सी एएस के साथ (ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) एएस योग 1, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसीडिंग) योग 3 के रूप में, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 2 के रूप में। ऑर्डर) ऑर्डरिड, ऑर्डरडेट, कस्टिड, योग 2, योग 1, योग 3 कोर्डर द्वारा कस्टिड, ऑर्डरिड द्वारा चुनें;

इस क्वेरी की योजना चित्र 5 में दिखाई गई है।

चित्र 5:प्रश्न 5 की योजना

आपको अभी भी योजना में केवल दो प्रकार मिलते हैं, इस तथ्य के बावजूद कि आउटपुट में कॉलम ऑर्डर है:अन्य कॉलम, योग 2, योग 1, योग 3, जैसे क्वेरी 2 में।

नामित तालिका अभिव्यक्ति के साथ इस चाल के लिए एक चेतावनी यह है कि यदि तालिका अभिव्यक्ति में आपके कॉलम बाहरी क्वेरी द्वारा संदर्भित नहीं हैं, तो उन्हें योजना से बाहर रखा गया है और इसलिए गिनती नहीं है।

निम्नलिखित प्रश्न पर विचार करें, जिसे मैं प्रश्न 6 के रूप में संदर्भित करूंगा:

सी AS के साथ (ऑर्डरिड, ऑर्डरडेट, कस्टिड, MAX(ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड ROWS अनबाउंडेड प्रीसीडिंग) मैक्स 1, MAX (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड अधिकतम 3 PRECEDING के रूप में) , MAX (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन असीमित पूर्ववर्ती) अधिकतम 2 के रूप में, एवीजी (ऑर्डरिड) ओवर (ऑर्डर तिथि के अनुसार कस्टिड ऑर्डर द्वारा विभाजन, ऑर्डरिड पंक्तियाँ असीमित पूर्ववर्ती) के रूप में (1.0 * ऑर्डर आईडी) असंबद्ध पूर्ववर्ती के रूप में ऑर्डरिड पंक्तियों द्वारा असीमित पूर्ववर्ती) औसत 3 के रूप में, औसत (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन असीमित पूर्ववर्ती) औसत 2 के रूप में, योग (ऑर्डरिड) ओवर (कस्टिड द्वारा विभाजन ऑर्डरिड ऑर्डरिंग द्वारा ऑर्डरिड) ) ओवर (ऑर्डर की तारीख के अनुसार ऑर्डर द्वारा ऑर्डर, ऑर्डरिड पंक्तियों को अनबाउंडेड प्रीसीडिंग) योग 1 के रूप में, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) डीबीओ से योग 3 के रूप में। , sum3, max2, max1, max3, avg2, avg1, avg3FROM COR डेर बाय कस्टिड, ऑर्डरिड;

यहां सभी टेबल एक्सप्रेशन कॉलम बाहरी क्वेरी द्वारा संदर्भित होते हैं, इसलिए ऑप्टिमाइज़ेशन टेबल एक्सप्रेशन के भीतर प्रत्येक ऑर्डरिंग आवश्यकता की पहली विशिष्ट घटना के आधार पर होता है:

  • max1:कस्टिड, ऑर्डरडेट, ऑर्डरिड
  • मैक्स3:ऑर्डरिड
  • max2:कस्टिड, ऑर्डरिड

इसका परिणाम केवल दो प्रकार की योजना में होता है जैसा कि चित्र 6 में दिखाया गया है।

चित्र 6:प्रश्न 6 के लिए योजना

अब मैक्स 2, मैक्स 1, मैक्स 3, एवीजी 2, एवीजी 1 और एवीजी 3 के संदर्भों को हटाकर केवल बाहरी क्वेरी को बदलें:

सी AS के साथ (ऑर्डरिड, ऑर्डरडेट, कस्टिड, MAX(ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड ROWS अनबाउंडेड प्रीसीडिंग) मैक्स 1, MAX (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड अधिकतम 3 PRECEDING के रूप में) , MAX (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन असीमित पूर्ववर्ती) अधिकतम 2 के रूप में, एवीजी (ऑर्डरिड) ओवर (ऑर्डर तिथि के अनुसार कस्टिड ऑर्डर द्वारा विभाजन, ऑर्डरिड पंक्तियाँ असीमित पूर्ववर्ती) के रूप में (1.0 * ऑर्डर आईडी) असंबद्ध पूर्ववर्ती के रूप में ऑर्डरिड पंक्तियों द्वारा असीमित पूर्ववर्ती) औसत 3 के रूप में, औसत (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा विभाजन असीमित पूर्ववर्ती) औसत 2 के रूप में, योग (ऑर्डरिड) ओवर (कस्टिड द्वारा विभाजन ऑर्डरिड ऑर्डरिंग द्वारा ऑर्डरिड ऑर्डरिड) ) ओवर (ऑर्डर की तारीख के अनुसार ऑर्डर द्वारा ऑर्डर, ऑर्डरिड पंक्तियों को अनबाउंडेड प्रीसीडिंग) योग 1 के रूप में, एसयूएम (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) डीबीओ से योग 3 के रूप में। , sum3FROM CORDER BY custid, orderid;

मैं इस क्वेरी को क्वेरी 7 के रूप में संदर्भित करूंगा। तालिका अभिव्यक्ति में max1, max3, max2, avg1, avg3, और avg2 की गणना बाहरी क्वेरी के लिए अप्रासंगिक है, इसलिए उन्हें बाहर रखा गया है। टेबल एक्सप्रेशन में विंडो फ़ंक्शंस को शामिल करने वाली शेष गणनाएँ, जो बाहरी क्वेरी के लिए प्रासंगिक हैं, sum2, sum1, और sum3 की हैं। दुर्भाग्य से, वे न्यूनतम प्रकार के संदर्भ में तालिका अभिव्यक्ति में इष्टतम क्रम में प्रकट नहीं होते हैं। जैसा कि आप इस प्रश्न की योजना में देख सकते हैं जैसा कि चित्र 7 में दिखाया गया है, चार प्रकार हैं।

चित्र 7:प्रश्न 7 की योजना

यदि आप सोच रहे हैं कि यह संभावना नहीं है कि आपके पास आंतरिक क्वेरी में कॉलम होंगे जो आप बाहरी क्वेरी में नहीं देखेंगे, तो विचार करें। हर बार जब आप किसी दृश्य को क्वेरी करते हैं, तो हो सकता है कि आपकी रुचि स्तंभों के किसी भिन्न सबसेट में हो। इसे ध्यान में रखते हुए, पांचवीं युक्ति योजना के प्रकारों को कम करने में मदद कर सकती है।

टिप 5:सीटीई या व्यू जैसे नामित टेबल एक्सप्रेशन की आंतरिक क्वेरी में, सभी विंडो फ़ंक्शंस को समान ऑर्डरिंग ज़रूरतों के साथ समूहीकृत करें, और फ़ंक्शंस के समूहों के क्रम में टिप्स 1 और 2 का पालन करें।

निम्नलिखित कोड इस अनुशंसा के आधार पर एक दृश्य लागू करता है:

 डीबीओ बनाएं या बदलें। MyViewAS सेलेक्ट ऑर्डर आईडी, ऑर्डरडेट, कस्टिड, मैक्स (ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) मैक्स 1, एसयूएम (ऑर्डरिड) ओवर (पार्टीशन ऑर्डर द्वारा ऑर्डर डेट) , ऑर्डरिड रो अनबाउंडेड प्रीसीडिंग) योग 1, एवीजी (ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) एवीजी 1, मैक्स (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड) अधिकतम 3 के रूप में, एसयूएम ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) योग 3 के रूप में, एवीजी (1.0 * ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा ऑर्डर अनबाउंडेड प्रीसिडिंग) एवीजी 3 के रूप में, मैक्स (ऑर्डरिड) ओवर (कस्टिड द्वारा विभाजन) ऑर्डरिड पंक्तियों के अनुसार अधिकतम 2 , एवीजी (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन अनबाउंडेड प्रीसीडिंग) एवीजी 2 के रूप में, एसयूएम (ऑर्डरिड) ओवर (कस्टिड ऑर्डर द्वारा ऑर्डर की गई पंक्तियों को अनबाउंडेड प्रीसिडिंग द्वारा पार्टिशन) सम 2 ऑर्डर के रूप में; 

अब इस क्रम में केवल विंडो वाले परिणाम कॉलम sum2, sum1, और sum3 का अनुरोध करने वाले दृश्य को क्वेरी करें:

ऑर्डरिड, ऑर्डरडेट, कस्टिड, सम2, सम1, डीबीओ से सम3 चुनें। कस्टिड, ऑर्डरिड द्वारा MyViewORDER;

मैं इस प्रश्न को प्रश्न 8 के रूप में संदर्भित करूंगा। आपको केवल दो प्रकार के साथ चित्र 8 में दिखाया गया प्लान मिलता है।

चित्र 8:प्रश्न 8 की योजना

टिप 6

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

मुझे इसका प्रदर्शन करने दो। पहले याद करें जब आपने idx_nc_cid_od_oid इंडेक्स बनाया था, जो विंडो फ़ंक्शंस का समर्थन कर सकता है, जिसे कस्टिड, ऑर्डरडेट, ऑर्डरिड द्वारा ऑर्डर किए गए डेटा की आवश्यकता होती है, जैसे कि निम्न अभिव्यक्ति:

SUM(orderid) OVER(PARTITION by custid order by orderdate, orderid ROWS unbounded PRECEDING)

मान लीजिए, इस विंडो फ़ंक्शन के अलावा, आपको उसी क्वेरी में निम्न विंडो फ़ंक्शन की भी आवश्यकता है:

SUM(orderid) OVER(PARTITION by custid order by orderid rows unbounded PRECEDING)

इस विंडो फ़ंक्शन को निम्न अनुक्रमणिका से लाभ होगा:

अद्वितीय गैर-अनुक्रमित अनुक्रमणिका बनाएं idx_nc_cid_oid dbo पर।आदेश(कस्टिड, ऑर्डरिड);

निम्न क्वेरी, जिसे मैं क्वेरी 9 के रूप में संदर्भित करूंगा, दोनों विंडो फ़ंक्शंस को आमंत्रित करती है:

सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड रो अनबाउंडेड प्रीसिडिंग) योग 1 के रूप में, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरिड पंक्तियों के आधार पर कस्टिड ऑर्डर द्वारा विभाजन अनबाउंडेड के रूप में) dbo.आदेश;

इस क्वेरी की योजना चित्र 9 में दिखाई गई है।

चित्र 9:प्रश्न 9 के लिए योजना

SSMS में छोड़े गए परिणामों के साथ, मुझे अपनी मशीन पर इस क्वेरी के लिए निम्नलिखित समय के आँकड़े मिलते हैं:

CPU समय =3234 ms, बीता हुआ समय =3354 ms.

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

सी1 एएस के साथ (सेलेक्ट ऑर्डरिड, ऑर्डरडेट, कस्टिड, एसयूएम (ऑर्डरिड) ओवर (ऑर्डरडेट द्वारा कस्टिड ऑर्डर द्वारा पार्टिशन, ऑर्डरिड आरओडब्ल्यू अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 1 के रूप में। ऑर्डर), सी 2 एएस (सेलेक्ट ऑर्डरिड, कस्टिड, एसयूएम ( ऑर्डरिड) ओवर (कस्टिड ऑर्डर द्वारा ऑर्डरिड पंक्तियों द्वारा अनबाउंडेड प्रीसीडिंग) डीबीओ से योग 2 के रूप में। ऑर्डर) C1.orderid, C1.orderdate, C1.custid, C1.sum1, C2.sum2 से C1 इनर जॉइन C2 =C1 पर चुनें। C2.orderid;

मैं इस क्वेरी को क्वेरी 10 के रूप में संदर्भित करूंगा। इस क्वेरी की योजना चित्र 10 में दिखाई गई है।

चित्र 10:प्रश्न 10 के लिए योजना

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

मुझे अपनी मशीन पर इस क्वेरी के लिए निम्नलिखित समय के आँकड़े मिलते हैं (फिर से SSMS में छोड़े गए परिणामों के साथ):

CPU समय =1000 ms, बीता हुआ समय =1100 ms.

संक्षेप में, यह रहा हमारा छठा सुझाव।

टिप 6:जब आपके पास कई अलग-अलग ऑर्डरिंग आवश्यकताओं के साथ कई विंडो फ़ंक्शन हैं, और आप उन सभी को इंडेक्स के साथ समर्थन करने में सक्षम हैं, तो एक जॉइन वर्जन आज़माएं और इसके प्रदर्शन की तुलना बिना शामिल हुए क्वेरी से करें।

सफाई

यदि आपने डेटाबेस स्कोप्ड कॉन्फ़िगरेशन विकल्प MAXDOP को 1 पर सेट करके समांतरता को अक्षम कर दिया है, तो इसे 0:

पर सेट करके समांतरता को पुन:सक्षम करें।
ALTER DATABASE स्कोप्ड कॉन्फ़िगरेशन सेट MAXDOP =0;

यदि आपने गैर-दस्तावेज सत्र विकल्प DBCC OPTIMIZER_WHATIF का उपयोग किया है जिसमें CPU विकल्प 1 पर सेट है, तो इसे 0:

पर सेट करके समांतरता को पुन:सक्षम किया जा सकता है।
DBCC OPTIMIZER_WHATIF(CPUs, 0);

यदि आप चाहें तो समांतरता सक्षम के साथ सभी उदाहरणों का पुन:प्रयास कर सकते हैं।

आपके द्वारा बनाई गई नई अनुक्रमणिका को साफ़ करने के लिए निम्न कोड का उपयोग करें:

DROP INDEX IF EXISTS idx_nc_cid_od_oid ON dbo.Orders;DROP INDEX IF EXISTS idx_nc_cid_oid ON dbo.Orders;

और दृश्य को हटाने के लिए निम्न कोड:

ड्रॉप व्यू अगर मौजूद है dbo.MyView;

सॉर्ट की संख्या को कम करने के लिए सुझावों का पालन करें

विंडो फ़ंक्शंस को ऑर्डर किए गए इनपुट डेटा को संसाधित करने की आवश्यकता होती है। अनुक्रमण योजना में छँटाई को समाप्त करने में मदद कर सकता है, लेकिन आम तौर पर केवल एक अलग क्रम की आवश्यकता के लिए। कई ऑर्डरिंग जरूरतों वाली क्वेरी में आमतौर पर उनकी योजनाओं में कुछ प्रकार शामिल होते हैं। हालाँकि, कुछ युक्तियों का पालन करके, आप आवश्यक प्रकारों की संख्या को कम कर सकते हैं। यहां उन सुझावों का सारांश दिया गया है जिनका मैंने इस लेख में उल्लेख किया है:

  • युक्ति 1: यदि आपके पास क्वेरी में कुछ विंडो फ़ंक्शंस का समर्थन करने के लिए एक अनुक्रमणिका है, तो पहले उन्हें निर्दिष्ट करें।
  • टिप 2: यदि क्वेरी में क्वेरी में प्रेजेंटेशन ऑर्डरिंग के समान ऑर्डरिंग आवश्यकता वाले विंडो फ़ंक्शंस शामिल हैं, तो उन फ़ंक्शंस को अंतिम रूप से निर्दिष्ट करें।
  • टिप 3: प्रत्येक विशिष्ट आदेश की आवश्यकता की पहली घटना के लिए युक्तियाँ 1 और 2 का पालन करना सुनिश्चित करें। एक ही क्रम की आवश्यकता के बाद की घटनाओं, भले ही गैर-आसन्न, की पहचान की जाती है और उन्हें पहले के साथ समूहीकृत किया जाता है।
  • युक्ति 4: उपरोक्त अनुशंसाएं कोड में विंडो फ़ंक्शंस के प्रकटन क्रम पर लागू होती हैं, भले ही एक नामित तालिका अभिव्यक्ति जैसे सीटीई या दृश्य के भीतर, और भले ही बाहरी क्वेरी कॉलम को नामित तालिका अभिव्यक्ति की तुलना में एक अलग क्रम में लौटाती है। इसलिए, यदि आपको आउटपुट में एक निश्चित क्रम में कॉलम वापस करने की आवश्यकता है, और यह योजना में न्यूनतम प्रकार के मामले में इष्टतम क्रम से अलग है, तो नामित तालिका अभिव्यक्ति के भीतर उपस्थिति क्रम के संदर्भ में युक्तियों का पालन करें, और कॉलम वापस करें बाहरी क्वेरी में वांछित आउटपुट क्रम में।
  • युक्ति 5: एक सीटीई या दृश्य जैसे नामित तालिका अभिव्यक्ति की आंतरिक क्वेरी में, सभी विंडो फ़ंक्शंस को समान ऑर्डरिंग आवश्यकताओं के साथ समूहित करें, और फ़ंक्शंस के समूहों के क्रम में टिप्स 1 और 2 का पालन करें।
  • युक्ति 6: जब आपके पास कई अलग-अलग ऑर्डरिंग जरूरतों के साथ कई विंडो फ़ंक्शन हों, और आप उन सभी को इंडेक्स के साथ समर्थन करने में सक्षम हों, तो एक जॉइन वर्जन आज़माएं और इसके प्रदर्शन की तुलना बिना जॉइन किए क्वेरी से करें।

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. बीसीपी उपयोगिता के साथ फ्लैट फ़ाइल में डेटा कैसे निर्यात करें और बल्क इंसर्ट के साथ डेटा आयात करें

  2. एकाधिक जॉइन क्वेरी के लिए खराब क्यों हैं या ऑप्टिमाइज़र के रास्ते में नहीं आते हैं

  3. एंटरप्राइज़ संस्करण में NOEXPAND संकेतों का उपयोग करने का एक अन्य कारण

  4. सेल्सफोर्स टीएलएस 1.0 बहिष्करण

  5. चेन संकेतन

© कॉपीराइट http://hi.sqldat.com सर्वाधिकार सुरक्षित