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

समानांतर योजनाएँ कैसे शुरू होती हैं - भाग 3

यह पांच-भाग की श्रृंखला में तीसरा है जो SQL सर्वर पंक्ति मोड समानांतर योजनाओं को निष्पादित करना शुरू करने के तरीके में गहरा गोता लगाता है। भाग 1 ने मूल कार्य के लिए निष्पादन संदर्भ शून्य को प्रारंभ किया, और भाग 2 ने क्वेरी स्कैन ट्री बनाया। अब हम क्वेरी स्कैन शुरू करने के लिए तैयार हैं, कुछ प्रारंभिक चरण प्रदर्शन करें प्रसंस्करण, और पहले अतिरिक्त समानांतर कार्य प्रारंभ करें।

क्वेरी स्कैन स्टार्ट अप

याद रखें कि केवल मूल कार्य अभी मौजूद है, और एक्सचेंजों (समानांतरता ऑपरेटरों) के पास केवल एक उपभोक्ता पक्ष है। फिर भी, यह पैरेंट कार्य के वर्कर थ्रेड पर क्वेरी निष्पादन शुरू करने के लिए पर्याप्त है। क्वेरी प्रोसेसर CQueryScan::StartupQuery पर कॉल के माध्यम से क्वेरी स्कैन प्रक्रिया प्रारंभ करके निष्पादन प्रारंभ करता है . योजना का अनुस्मारक (विस्तार करने के लिए क्लिक करें):

यह प्रक्रिया का अब तक का पहला बिंदु है कि एक इन-फ्लाइट निष्पादन योजना sys.dm_exec_query_statistics_xml में उपलब्ध है (SQL Server 2016 SP1 आगे) . इस समय ऐसी योजना में देखने के लिए विशेष रूप से दिलचस्प कुछ भी नहीं है, क्योंकि सभी क्षणिक काउंटर शून्य हैं, लेकिन योजना कम से कम उपलब्ध है। . इस बात का कोई संकेत नहीं है कि समानांतर कार्य अभी तक नहीं बनाए गए हैं, या एक्सचेंजों में निर्माता पक्ष की कमी है। योजना हर तरह से 'सामान्य' दिखती है।

समानांतर योजना शाखाएं

चूंकि यह एक समानांतर योजना है, इसलिए इसे शाखाओं में विभाजित करके दिखाना उपयोगी होगा। इन्हें नीचे छायांकित किया गया है, और शाखाओं ए से डी के रूप में लेबल किया गया है:

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

हमारी उदाहरण क्वेरी डीओपी 2 पर चल रही है, इसलिए शाखा बी को दो अतिरिक्त कार्य मिलेंगे। वही शाखा C और शाखा D के लिए जाता है, जो कुल छः . देता है अतिरिक्त काम। प्रत्येक कार्य अपने स्वयं के निष्पादन संदर्भ में अपने स्वयं के कार्यकर्ता धागे पर चलेगा।

दो अनुसूचक (एस<उप>1 और एस<उप>2 ) अतिरिक्त समानांतर श्रमिकों को चलाने के लिए इस क्वेरी को सौंपा गया है। प्रत्येक अतिरिक्त कार्यकर्ता उन दो अनुसूचियों में से एक पर चलेगा। मूल कार्यकर्ता किसी भिन्न शेड्यूलर पर चल सकता है, इसलिए हमारी DOP 2 क्वेरी अधिकतम तीन का उपयोग कर सकती है प्रोसेसर कोर किसी एक समय में।

संक्षेप में, हमारी योजना के पास अंततः होगा:

  • शाखा ए (माता-पिता)
    • अभिभावक कार्य।
    • अभिभावक कार्यकर्ता सूत्र।
    • निष्पादन संदर्भ शून्य।
    • क्वेरी के लिए उपलब्ध कोई भी शेड्यूलर।
  • शाखा बी (अतिरिक्त)
    • दो अतिरिक्त कार्य।
    • हर नए काम के लिए एक अतिरिक्त वर्कर थ्रेड।
    • दो नए निष्पादन संदर्भ, प्रत्येक नए कार्य के लिए एक।
    • एक वर्कर थ्रेड शेड्यूलर S1 पर चलता है . दूसरा शेड्यूलर S2 . पर चलता है ।
  • शाखा सी (अतिरिक्त)
    • दो अतिरिक्त कार्य।
    • हर नए काम के लिए एक अतिरिक्त वर्कर थ्रेड।
    • दो नए निष्पादन संदर्भ, प्रत्येक नए कार्य के लिए एक।
    • एक वर्कर थ्रेड शेड्यूलर S1 पर चलता है . दूसरा शेड्यूलर S2 . पर चलता है ।
  • शाखा डी (अतिरिक्त)
    • दो अतिरिक्त कार्य।
    • हर नए काम के लिए एक अतिरिक्त वर्कर थ्रेड।
    • दो नए निष्पादन संदर्भ, प्रत्येक नए कार्य के लिए एक।
    • एक वर्कर थ्रेड शेड्यूलर S1 पर चलता है . दूसरा शेड्यूलर S2 . पर चलता है ।

सवाल यह है कि इन सभी अतिरिक्त कार्यों, श्रमिकों और निष्पादन संदर्भों को कैसे बनाया जाता है, और जब वे चलना शुरू करते हैं।

आरंभिक क्रम

वह क्रम जिसमें अतिरिक्त कार्य इस विशेष योजना के लिए executing क्रियान्वित करना प्रारंभ करें है:

  1. शाखा ए (मूल कार्य)।
  2. शाखा सी (अतिरिक्त समानांतर कार्य)।
  3. शाखा डी (अतिरिक्त समानांतर कार्य)।
  4. शाखा बी (अतिरिक्त समानांतर कार्य)।

हो सकता है कि वह स्टार्ट-अप ऑर्डर न हो जिसकी आप अपेक्षा कर रहे थे।

एक महत्वपूर्ण विलंब हो सकता है इनमें से प्रत्येक चरण के बीच, हम शीघ्र ही कारणों का पता लगाएंगे। इस स्तर पर मुख्य बिंदु यह है कि अतिरिक्त कार्य, कार्यकर्ता और निष्पादन संदर्भ नहीं . हैं सभी एक साथ बनाए गए हैं, और वे नहीं . करते हैं सभी एक ही समय पर क्रियान्वित करना शुरू करते हैं।

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

SQL सर्वर द्वारा नियोजित डिज़ाइन के साथ, समानांतर योजनाएँ अक्सर (DOP को शाखाओं की कुल संख्या से गुणा करने) की तुलना में कम कुल वर्कर थ्रेड्स का उपयोग करती हैं। यह पहचानने के द्वारा प्राप्त किया जाता है कि कुछ शाखाएँ किसी अन्य शाखा के शुरू होने से पहले पूरी हो सकती हैं। यह एक ही क्वेरी के भीतर थ्रेड्स के पुन:उपयोग की अनुमति दे सकता है, और आम तौर पर समग्र रूप से संसाधन खपत को कम करता है।

आइए अब विवरण की ओर मुड़ें कि हमारी समानांतर योजना कैसे शुरू होती है।

शाखा ए खोलना

Open() . कॉल करने वाले पैरेंट टास्क के साथ क्वेरी स्कैन शुरू होता है पेड़ की जड़ में इटरेटर पर। यह निष्पादन क्रम की शुरुआत है:

  1. शाखा A (मूल कार्य)।
  2. शाखा सी (अतिरिक्त समानांतर कार्य)।
  3. शाखा डी (अतिरिक्त समानांतर कार्य)।
  4. शाखा बी (अतिरिक्त समानांतर कार्य)।

हम अनुरोधित 'वास्तविक' योजना के साथ इस क्वेरी को क्रियान्वित कर रहे हैं, इसलिए रूट इटरेटर नहीं . है नोड 0 पर अनुक्रम प्रोजेक्ट ऑपरेटर। बल्कि, यह अदृश्य प्रोफाइलिंग इटरेटर . है जो पंक्ति मोड योजनाओं में रनटाइम मेट्रिक्स को रिकॉर्ड करता है।

नीचे दिया गया उदाहरण योजना की शाखा ए में क्वेरी स्कैन इटरेटर्स को दिखाता है, जिसमें अदृश्य प्रोफाइलिंग इटरेटर्स की स्थिति 'चश्मा' आइकन द्वारा दर्शायी जाती है।

पहला प्रोफाइलर खोलने के लिए एक कॉल के साथ निष्पादन शुरू होता है, CQScanProfileNew::Open . यह खुले समय . सेट करता है ऑपरेटिंग सिस्टम के क्वेरी परफॉर्मेंस काउंटर एपीआई के माध्यम से चाइल्ड सीक्वेंस प्रोजेक्ट ऑपरेटर के लिए।

हम इस नंबर को sys.dm_exec_query_profiles . में देख सकते हैं :

वहां की प्रविष्टियों में ऑपरेटर के नाम सूचीबद्ध हो सकते हैं, लेकिन डेटा प्रोफाइलर . से आता है ऑपरेटर के ऊपर, न कि स्वयं ऑपरेटर के ऊपर।

जैसे ही होता है, एक अनुक्रम प्रोजेक्ट (CQScanSeqProjectNew ) को खोलने . पर कोई काम करने की आवश्यकता नहीं है , इसलिए इसमें वास्तव में Open() नहीं है तरीका। अनुक्रम परियोजना के ऊपर प्रोफाइलर है कहा जाता है, इसलिए डीएमवी में अनुक्रम परियोजना के लिए एक खुला समय दर्ज किया जाता है।

प्रोफाइलर का Open विधि Open को कॉल नहीं करती अनुक्रम परियोजना पर (क्योंकि इसमें एक नहीं है)। इसके बजाय यह Open . को कॉल करता है क्रम में अगले पुनरावर्तक के लिए प्रोफाइलर पर। यह सेगमेंट . है नोड 1 पर इटरेटर। यह खंड के लिए खुला समय निर्धारित करता है, जैसा कि पूर्व प्रोफाइलर ने अनुक्रम परियोजना के लिए किया था:

एक खंड पुनरावर्तक करता है खोले जाने पर करने के लिए चीजें हैं, इसलिए अगली कॉल CQScanSegmentNew::Open पर है . एक बार जब खंड ने वह कर लिया जिसकी उसे आवश्यकता है, तो यह अगले पुनरावर्तक के लिए प्रोफाइलर को क्रम से बुलाता है — उपभोक्ता इकट्ठा स्ट्रीम एक्सचेंज . के किनारे नोड 2 पर:

खोलने की प्रक्रिया में क्वेरी स्कैन ट्री का अगला कॉल CQScanExchangeNew::Open है , जहां चीजें अधिक दिलचस्प होने लगती हैं।

गेदर स्ट्रीम एक्सचेंज खोलना

एक्सचेंज के उपभोक्ता पक्ष को खोलने के लिए कहना:

  • एक स्थानीय (समानांतर नेस्टेड) ​​लेनदेन खोलता है (CXTransLocal::Open ) प्रत्येक प्रक्रिया को एक युक्त लेन-देन की आवश्यकता होती है, और अतिरिक्त समानांतर कार्य कोई अपवाद नहीं हैं। वे पैरेंट (आधार) लेनदेन को सीधे साझा नहीं कर सकते हैं, इसलिए नेस्टेड लेनदेन का उपयोग किया जाता है। जब एक समानांतर कार्य को मूल लेन-देन तक पहुंचने की आवश्यकता होती है, तो यह एक कुंडी पर सिंक्रनाइज़ होता है, और NESTING_TRANSACTION_READONLY का सामना कर सकता है या NESTING_TRANSACTION_FULL प्रतीक्षा करता है।
  • वर्तमान वर्कर थ्रेड को एक्सचेंज पोर्ट के साथ पंजीकृत करता है (CXPort::Register )।
  • एक्सचेंज के उपभोक्ता पक्ष पर अन्य थ्रेड्स के साथ सिंक्रनाइज़ करता है (sqlmin!CXTransLocal::Synchronize ) एकत्रित धाराओं के उपभोक्ता पक्ष पर कोई अन्य धागे नहीं हैं, इसलिए यह अनिवार्य रूप से इस अवसर पर एक नो-ऑप है।

“प्रारंभिक चरण” संसाधन

मूल कार्य अब शाखा A के किनारे पर पहुंच गया है। अगला चरण विशेष . है पंक्ति मोड समानांतर योजनाओं के लिए:मूल कार्य CQScanExchangeNew::EarlyPhases को कॉल करके निष्पादन जारी रखता है इकट्ठा धाराओं पर नोड 2 पर इटरेटर का आदान-प्रदान करें। यह सामान्य Open से परे एक अतिरिक्त पुनरावर्तक विधि है। , GetRow , और Close ऐसे तरीके जिनसे आप में से कई लोग परिचित होंगे। EarlyPhases केवल पंक्ति मोड समानांतर योजनाओं में कहा जाता है।

मैं इस बिंदु पर कुछ के बारे में स्पष्ट होना चाहता हूं:नोड 2 पर एकत्रित स्ट्रीम एक्सचेंज के निर्माता पक्ष में नहीं है अभी तक बनाया गया है, और नहीं अतिरिक्त समानांतर कार्य बनाए गए हैं। अभी चल रहे एकमात्र थ्रेड का उपयोग करके, हम अभी भी मूल कार्य के लिए कोड निष्पादित कर रहे हैं।

सभी पुनरावर्तक EarlyPhases को लागू नहीं करते हैं , क्योंकि उन सभी के पास इस बिंदु पर पंक्ति मोड समानांतर योजनाओं में करने के लिए कुछ विशेष नहीं है। यह अनुक्रम प्रोजेक्ट के समान है जो Open . को लागू नहीं कर रहा है विधि क्योंकि उस समय इसका कोई लेना-देना नहीं है। EarlyPhases . के साथ मुख्य पुनरावर्तक तरीके हैं:

  • CQScanConcatNew (संयोजन)।
  • CQScanMergeJoinNew (मर्ज जॉइन)।
  • CQScanSwitchNew (स्विच)।
  • CQScanExchangeNew (समानतावाद)।
  • CQScanNew (रोसेट एक्सेस जैसे स्कैन और तलाश)।
  • CQScanProfileNew (अदृश्य प्रोफाइलर)।
  • CQScanLightProfileNew (अदृश्य हल्के प्रोफाइलर)।

शाखा B प्रारंभिक चरण

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

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

याद रखें, हम अभी भी निष्पादन संदर्भ शून्य में हैं, इसलिए मैं इसे सुविधा के लिए केवल शाखा बी के रूप में संदर्भित कर रहा हूं। हमने शुरू नहीं किया कोई समानांतर निष्पादन अभी तक।

शाखा बी में प्रारंभिक चरण कोड आह्वान का क्रम है:

  • CQScanProfileNew::EarlyPhases नोड 3 के ऊपर के प्रोफाइलर के लिए।
  • CQScanMergeJoinNew::EarlyPhases नोड 3 पर शामिल हों
  • CQScanProfileNew::EarlyPhases नोड 4 के ऊपर के प्रोफाइलर के लिए। नोड 4 स्ट्रीम एग्रीगेट अपने आप में एक प्रारंभिक चरण विधि नहीं है।
  • CQScanProfileNew::EarlyPhases नोड 5 के ऊपर के प्रोफाइलर पर।
  • CQScanExchangeNew::EarlyPhases पुनर्विभाजन स्ट्रीम . के लिए नोड 5 पर एक्सचेंज करें।

ध्यान दें कि हम इस स्तर पर केवल बाहरी (ऊपरी) इनपुट को मर्ज में शामिल होने के लिए संसाधित कर रहे हैं। यह केवल सामान्य पंक्ति मोड निष्पादन पुनरावृत्त अनुक्रम है। यह समानांतर योजनाओं के लिए विशेष नहीं है।

शाखा C प्रारंभिक चरण

शाखा सी में पुनरावृत्तियों के साथ प्रारंभिक चरण प्रसंस्करण जारी है:

यहां कॉल का क्रम है:

  • CQScanProfileNew::EarlyPhases नोड 6 से ऊपर के प्रोफाइलर के लिए।
  • CQScanProfileNew::EarlyPhases नोड 7 से ऊपर के प्रोफाइलर के लिए।
  • CQScanProfileNew::EarlyPhases नोड 9 के ऊपर प्रोफाइलर पर।
  • CQScanNew::EarlyPhases अनुक्रमणिका के लिए नोड 9 पर तलाश करें।

कोई EarlyPhases नहीं है स्ट्रीम एग्रीगेट या सॉर्ट पर विधि। नोड 8 पर कंप्यूट स्केलर द्वारा किया गया कार्य स्थगित . है (सॉर्ट करने के लिए), इसलिए यह क्वेरी स्कैन ट्री में प्रकट नहीं होता है, और इसमें कोई संबद्ध प्रोफाइलर नहीं है।

प्रोफाइलर समय के बारे में

मूल कार्य प्रारंभिक चरण संसाधन नोड 2 पर इकट्ठा धाराओं के आदान-प्रदान पर शुरू हुआ। यह क्वेरी स्कैन ट्री से उतरा, मर्ज में शामिल होने के लिए बाहरी (ऊपरी) इनपुट के बाद, सभी तरह से इंडेक्स तक नीचे नोड 9 की तलाश है। रास्ते में, मूल कार्य को बुलाया गया है EarlyPhases इसका समर्थन करने वाले प्रत्येक पुनरावर्तक पर विधि।

शुरुआती चरणों में से कोई भी गतिविधि अब तक अपडेट नहीं हुई है किसी भी समय डीएमवी प्रोफाइलिंग में। विशेष रूप से, प्रारंभिक चरण प्रसंस्करण द्वारा छुआ गया किसी भी पुनरावर्तक के पास अपना 'खुला समय' सेट नहीं है। यह समझ में आता है, क्योंकि प्रारंभिक चरण प्रसंस्करण सिर्फ समानांतर निष्पादन की स्थापना कर रहा है - ये ऑपरेटर खोले . होंगे बाद में निष्पादन के लिए।

नोड 9 पर इंडेक्स की तलाश एक लीफ नोड है - इसकी कोई संतान नहीं है। मूल कार्य अब नेस्टेड EarlyPhases . से लौटना शुरू होता है कॉल, आरोही क्वेरी स्कैन ट्री वापस एकत्रित स्ट्रीम एक्सचेंज की ओर।

प्रत्येक प्रोफाइलर क्वेरी प्रदर्शन काउंटर पर कॉल करता है उनके EarlyPhases . में प्रवेश पर API विधि, और वे इसे फिर से बाहर के रास्ते पर बुलाते हैं। दो संख्याओं के बीच का अंतर बीता हुआ समय . दर्शाता है इटरेटर और उसके सभी बच्चों . के लिए (चूंकि विधि कॉल नेस्टेड हैं)।

इंडेक्स के लिए प्रोफाइलर रिटर्न की तलाश के बाद, प्रोफाइलर डीएमवी इंडेक्स सीक के लिए बीता हुआ और CPU समय दिखाता है केवल, साथ ही साथ एक अपडेट किया गया पिछला सक्रिय समय। यह भी ध्यान दें कि यह जानकारी मूल कार्य . के विरुद्ध दर्ज की गई है (अभी एकमात्र विकल्प):

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

अगले प्रोफाइलर के बाद प्रारंभिक चरण कॉल रिटर्न, सॉर्ट समय अपडेट किया जाता है:

अगला रिटर्न हमें स्ट्रीम एग्रीगेट . के लिए प्रोफाइलर से आगे ले जाता है नोड 6 पर:

इस प्रोफाइलर से वापस लौटना हमें EarlyPhases . पर वापस ले जाता है पुनर्विभाजन स्ट्रीम . पर कॉल करें नोड 5 . पर एक्सचेंज करें . याद रखें कि यह वह जगह नहीं है जहां शुरुआती चरणों की कॉल का क्रम शुरू हुआ था - वह नोड 2 पर इकट्ठा स्ट्रीम एक्सचेंज था।

शाखा C समानांतर कार्य संलग्न

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

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

अपने सबट्री के लिए नेस्टेड प्रारंभिक चरण प्रसंस्करण पूरा करने के बाद (सूचकांक 9 पर नोड की तलाश में), एक्सचेंज अपना प्रारंभिक चरण का काम शुरू कर सकता है। यह खोलने . के समान ही प्रारंभ होता है नोड 2 पर एकत्रित धाराओं का आदान-प्रदान:

  • CXTransLocal::Open (स्थानीय समानांतर उप-लेनदेन खोलना)।
  • CXPort::Register (एक्सचेंज पोर्ट के साथ पंजीकरण)।

अगले चरण अलग हैं क्योंकि शाखा सी में पूरी तरह से अवरुद्ध करना . है इटरेटर (नोड 7 पर सॉर्ट)। नोड 5 पुनर्विभाजन धाराओं में प्रारंभिक चरण प्रसंस्करण निम्न कार्य करता है:

  • कॉल करता है CQScanExchangeNew::StartAllProducers . यह पहली बार है जब हमें निर्माता पक्ष . के संदर्भ में किसी भी चीज़ का सामना करना पड़ा है एक्सचेंज का। नोड 5 इस योजना का पहला एक्सचेंज है जिसने अपना निर्माता पक्ष बनाया है।
  • एक म्यूटेक्स का अधिग्रहण करता है इसलिए कोई अन्य धागा एक ही समय में कार्यों को कतारबद्ध नहीं कर सकता है।
  • निर्माता कार्यों के लिए समानांतर नेस्टेड लेनदेन शुरू करता है (CXPort::StartNestedTransactions और ReadOnlyXactImp::BeginParallelNestedXact )।
  • पैरेंट क्वेरी स्कैन ऑब्जेक्ट के साथ उप-लेनदेन पंजीकृत करता है (CQueryScan::AddSubXact )।
  • निर्माता डिस्क्रिप्टर बनाता है (CQScanExchangeNew::PxproddescCreate )।
  • नए निर्माता निष्पादन संदर्भ बनाता है (CExecContext ) निष्पादन संदर्भ शून्य से व्युत्पन्न।
  • प्लान इटरेटर्स के लिंक किए गए मैप को अपडेट करता है।
  • नए संदर्भ के लिए DOP सेट करता है (CQueryExecContext::SetDop ) ताकि सभी कार्य जान सकें कि समग्र डीओपी सेटिंग क्या है।
  • पैरामीटर कैश इनिशियलाइज़ करता है (CQueryExecContext::InitParamCache )।
  • समानांतर नेस्टेड लेनदेन को मूल लेनदेन से जोड़ता है (CExecContext::SetBaseXact )।
  • निष्पादन के लिए नई उप-प्रक्रियाओं को कतारबद्ध करता है (SubprocessMgr::EnqueueMultipleSubprocesses )।
  • नए समानांतर कार्य बनाता है sqldk!SOS_Node::EnqueueMultipleTasksDirect के माध्यम से कार्य ।

इस समय के आसपास मूल कार्य का कॉल स्टैक (आपमें से जो इन चीजों का आनंद लेते हैं) है:

भाग तीन का अंत

हमने अब निर्माता पक्ष बना लिया है नोड 5 पर पुनर्विभाजन धाराओं का आदान-प्रदान, अतिरिक्त समानांतर कार्य created बनाया गया शाखा सी चलाने के लिए, और सब कुछ वापस पैरेंट . से लिंक किया आवश्यकतानुसार संरचनाएँ। शाखा सी पहला . है किसी भी समानांतर कार्य को शुरू करने के लिए शाखा। इस श्रृंखला के अंतिम भाग में शाखा C के खुलने के बारे में विस्तार से देखा जाएगा, और शेष समानांतर कार्यों को शुरू किया जाएगा।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. उन्नत SQL:SQL तालिका में पैरामीटरयुक्त तालिका-मूल्यवान फ़ंक्शन का आउटपुट सम्मिलित करें

  2. टी-एसक्यूएल में दो तिथियों के बीच अंतर की गणना कैसे करें

  3. एसक्यूएल ऑर्डर बाय

  4. पैटर्न मिलान:अधिक मज़ा जब मैं एक बच्चा था

  5. टी-एसक्यूएल में कल की तारीख कैसे प्राप्त करें