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

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

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

शाखा C निष्पादन विवरण

यह निष्पादन क्रम का दूसरा चरण है:

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

हमारी समानांतर योजना में शाखाओं का एक अनुस्मारक (विस्तार करने के लिए क्लिक करें)

नए कार्यों . के कुछ समय बाद शाखा C के लिए कतारबद्ध हैं, SQL सर्वर एक कार्यकर्ता . संलग्न करता है प्रत्येक कार्य के लिए, और कार्यकर्ता को अनुसूचक . पर रखता है निष्पादन के लिए तैयार। प्रत्येक नया कार्य एक नए निष्पादन संदर्भ में चलता है। DOP 2 में, शाखा C के लिए दो नए कार्य, दो वर्कर थ्रेड और दो निष्पादन संदर्भ हैं। प्रत्येक कार्य शाखा C में अपने स्वयं के वर्कर थ्रेड पर इटरेटर की अपनी प्रतिलिपि चलाता है:

दो नए समानांतर कार्य एक उप-प्रक्रिया . पर चलने लगते हैं प्रवेश बिंदु, जो प्रारंभ में Open . की ओर ले जाता है एक्सचेंज के निर्माता पक्ष पर कॉल करें (CQScanXProducerNew::Open ) दोनों कार्यों में उनके जीवन की शुरुआत में समान कॉल स्टैक होते हैं:

एक्सचेंज सिंक्रोनाइज़ेशन

इस बीच, मूल कार्य (अपने स्वयं के कार्यकर्ता धागे पर चल रहा है) उप-प्रक्रिया प्रबंधक के साथ नई उप-प्रक्रियाओं को पंजीकृत करता है, फिर प्रतीक्षा करता है उपभोक्ता पक्ष . पर नोड 5 पर पुनर्विभाजन धाराओं का आदान-प्रदान होता है। मूल कार्य CXPACKET पर प्रतीक्षा करता है * जब तक सभी शाखा C के समानांतर कार्य अपना Open complete पूरा करते हैं कॉल करें और एक्सचेंज के निर्माता पक्ष में वापस आएं। समानांतर कार्य प्रत्येक पुनरावर्तक को उनके उपप्रकार में खोल देंगे (अर्थात अनुक्रमणिका खोज तक नीचे नोड 9 पर और पीछे) नोड 5 पर पुनर्विभाजन धाराओं के आदान-प्रदान पर लौटने से पहले। मूल कार्य CXPACKET पर प्रतीक्षा करेगा। जबकि ऐसा होता है। याद रखें कि मूल कार्य प्रारंभिक चरण कॉल निष्पादित कर रहा है।

हम इस प्रतीक्षा को प्रतीक्षारत कार्यों में देख सकते हैं DMV:

निष्पादन संदर्भ शून्य (मूल कार्य) दोनों नए निष्पादन संदर्भों द्वारा अवरुद्ध है। ये निष्पादन संदर्भ संदर्भ शून्य के बाद बनाए जाने वाले पहले अतिरिक्त हैं, इसलिए उन्हें एक और दो नंबर दिए गए हैं। जोर देने के लिए:दोनों नए निष्पादन संदर्भों को अपने उपप्रकारों को खोलने और मूल कार्य के लिए एक्सचेंज पर लौटने की आवश्यकता है CXPACKET समाप्त होने की प्रतीक्षा करें।

हो सकता है कि आप CXCONSUMER . देखने की उम्मीद कर रहे हों यहां प्रतीक्षा है, लेकिन वह प्रतीक्षा पंक्ति डेटा . पर प्रतीक्षा के लिए आरक्षित है आने के लिए। वर्तमान प्रतीक्षा पंक्तियों . के लिए नहीं है — यह निर्माता पक्ष के लिए खुला . है , इसलिए हमें एक सामान्य CXPACKET . मिलता है * रुको।

* Azure SQL डेटाबेस और प्रबंधित इंस्टेंस नए CXSYNC_PORT . का उपयोग करते हैं CXPACKET के बजाय प्रतीक्षा करें यहाँ, लेकिन उस सुधार ने अभी तक SQL सर्वर में अपना रास्ता नहीं बनाया है (2019 CU9 तक)।

नए समानांतर कार्यों का निरीक्षण करना

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

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

पुनर्विभाजन धाराएं नोड 5 पर एक्सचेंज अभी भी डीएमवी आउटपुट में केवल एक ही प्रविष्टि है। ऐसा इसलिए है क्योंकि संबद्ध अदृश्य प्रोफाइलर उपभोक्ता . पर नज़र रखता है विनिमय की ओर। अतिरिक्त समानांतर कार्य निर्माता . पर हैं विनिमय की ओर। नोड 5 का उपभोक्ता पक्ष आखिरकार होगा समानांतर कार्य हैं, लेकिन हम अभी तक उस मुकाम तक नहीं पहुंचे हैं।

चेकपॉइंट

यह सांस के लिए रुकने और संक्षेप में बताने के लिए एक अच्छा बिंदु लगता है कि इस समय सब कुछ कहाँ है। जैसे-जैसे हम आगे बढ़ेंगे, इनमें से और रुकने वाले बिंदु होंगे।

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

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

शाखा C समानांतर निष्पादन

दो समानांतर कार्य निर्माता पक्ष . से शुरू होते हैं नोड 5 पर पुनर्विभाजन धाराओं का आदान-प्रदान होता है। प्रत्येक की एक अलग (धारावाहिक) योजना होती है, जिसकी अपनी धारा कुल, सॉर्ट और इंडेक्स की तलाश होती है। गणना स्केलर रनटाइम योजना में प्रकट नहीं होता है क्योंकि इसकी गणना सॉर्ट करने के लिए स्थगित कर दी जाती है।

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

शाखा C के कार्य खुले हैं

Open . का क्रम शाखा सी में प्रत्येक कार्य के लिए कॉल है:

  • CQScanXProducerNew::Open . ध्यान दें कि किसी एक्सचेंज के निर्माता पक्ष पर कोई पूर्ववर्ती प्रोफाइलर नहीं है। क्वेरी ट्यूनर के लिए यह दुर्भाग्यपूर्ण है।
  • CXTransLocal::Open
  • CXPort::Register
  • CXTransLocal::ActivateWorkers
  • CQScanProfileNew::Open . नोड 6 के ऊपर का प्रोफाइलर।
  • CQScanStreamAggregateNew::Open (नोड 6)
  • CQScanProfileNew::Open . नोड 7 के ऊपर का प्रोफाइलर।
  • CQScanSortNew::Open (नोड 7)

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

सॉर्ट अपने सबट्री को खोलकर और उन सभी पंक्तियों का उपभोग करके अपनी सॉर्ट टेबल बनाता है जो उसके बच्चे प्रदान कर सकते हैं। एक बार छँटाई पूरी होने के बाद, छँटाई आउटपुट मोड में संक्रमण के लिए तैयार है, और यह अपने माता-पिता को नियंत्रण लौटाता है। सॉर्ट बाद में GetRow() का जवाब देगा कॉल, हर बार अगली क्रमबद्ध पंक्ति लौटाता है। सॉर्ट इनपुट के दौरान एक उदाहरण कॉल स्टैक है:

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

इस बिंदु पर प्रोफाइलिंग डीएमवी अद्यतन समय संख्या, और निकट समय . दिखाता है समानांतर अनुक्रमणिका के लिए चाहता है:

अधिक एक्सचेंज सिंक्रोनाइज़ेशन

याद रखें मूल कार्य उपभोक्ता . पर प्रतीक्षा कर रहा है सभी उत्पादकों को खोलने के लिए नोड 5 का पक्ष। एक समान सिंक्रनाइज़ेशन प्रक्रिया अब निर्माता . पर समानांतर कार्यों के बीच होती है एक ही एक्सचेंज का पक्ष:

प्रत्येक निर्माता कार्य CXTransLocal::Synchronize . के माध्यम से दूसरों के साथ सिंक्रनाइज़ होता है . निर्माता कॉल करते हैं CXPort::Open , फिर CXPACKET . पर प्रतीक्षा करें सभी उपभोक्ता पक्ष . के लिए समानांतर कार्य खोलने के लिए। जब पहली शाखा सी समानांतर कार्य एक्सचेंज के निर्माता पक्ष में वापस आता है और प्रतीक्षा करता है, तो प्रतीक्षा कार्य डीएमवी इस तरह दिखता है:

हमारे पास अभी भी मूल कार्य के उपभोक्ता-पक्ष की प्रतीक्षा है। नया CXPACKET हाइलाइट किया गया हमारा पहला निर्माता-पक्ष समानांतर कार्य है जो सभी उपभोक्ता-पक्ष समानांतर कार्यों की प्रतीक्षा कर रहा है एक्सचेंज पोर्ट खोलने के लिए।

उपभोक्ता-पक्ष समानांतर कार्य (शाखा बी में) अभी तक मौजूद नहीं हैं, इसलिए निर्माता कार्य निष्पादन संदर्भ के लिए NULL प्रदर्शित करता है जिसके द्वारा इसे अवरुद्ध किया जाता है। वर्तमान में पुनर्विभाजन स्ट्रीम एक्सचेंज के उपभोक्ता पक्ष पर प्रतीक्षारत कार्य मूल कार्य है (समानांतर कार्य नहीं!) चल रहा है EarlyPhases कोड, इसलिए यह गिनती नहीं है।

मूल कार्य CXPACKET प्रतीक्षा समाप्त

जब दूसरा शाखा सी में समानांतर कार्य अपने Open . से एक्सचेंज के निर्माता पक्ष में वापस आता है कॉल, सभी उत्पादकों ने एक्सचेंज पोर्ट खोल दिया है, इसलिए मूल कार्य उपभोक्ता पक्ष . पर एक्सचेंज का जारी किया गया इसके CXPACKET . से रुको।

उत्पादक पक्ष के कार्यकर्ता उपभोक्ता पक्ष के समानांतर कार्यों के निर्माण और एक्सचेंज पोर्ट खोलने की प्रतीक्षा करना जारी रखते हैं:

चेकपॉइंट

इस समय:

  • कुल तीन . हैं कार्य:शाखा सी में दो, साथ ही मूल कार्य।
  • दोनों निर्माता नोड 5 पर एक्सचेंज खुल गया है, और प्रतीक्षा . कर रहे हैं CXPACKET . पर उपभोक्ता पक्ष समानांतर कार्यों को खोलने के लिए। अधिकांश एक्सचेंज मशीनरी (पंक्ति बफ़र्स सहित) उपभोक्ता पक्ष द्वारा बनाई गई है, इसलिए उत्पादकों के पास अभी तक पंक्तियों को रखने के लिए कहीं नहीं है।
  • प्रकार शाखा सी में अपने सभी इनपुट का उपभोग कर लिया है, और क्रमबद्ध आउटपुट प्रदान करने के लिए तैयार हैं।
  • सूचकांक ढूंढता है शाखा सी में अपना काम पूरा कर लिया है और बंद कर दिया है।
  • मूल कार्य अभी हाल ही में CXPACKET . पर प्रतीक्षा से मुक्त किया गया है नोड 5 पुनर्विभाजन धाराओं के उपभोक्ता पक्ष में विनिमय। यह अभी भी है नेस्टेड EarlyPhases को क्रियान्वित करना कॉल.

शाखा D समानांतर कार्य प्रारंभ

निष्पादन क्रम में यह तीसरा चरण है:

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

इसके CXPACKET . से जारी किया गया नोड 5 पर पुनर्विभाजन स्ट्रीम एक्सचेंज के उपभोक्ता पक्ष पर प्रतीक्षा करें, पैरेंट कार्य आरोही शाखा बी क्वेरी स्कैन ट्री। यह नेस्टेड EarlyPhases . से लौटता है मर्ज जॉइन के बाहरी (ऊपरी) इनपुट पर विभिन्न इटरेटर्स और प्रोफाइलर्स को कॉल करता है।

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

एक बार वापस मर्ज में शामिल होने पर, मूल कार्य EarlyPhases को कॉल करता है मर्ज में शामिल होने के लिए आंतरिक (निचले) इनपुट पर इटरेटर और प्रोफाइलर्स के लिए। ये नोड्स 10 से 15 हैं (14 को छोड़कर, जो आस्थगित है):

एक बार जब पैरेंट टास्क के शुरुआती चरण की कॉल इंडेक्स की तलाश में नोड 15 पर पहुंच जाती है, तो यह फिर से पेड़ पर चढ़ना शुरू कर देता है (प्रोफाइलिंग समय निर्धारित करता है) जब तक कि यह नोड 11 पर रिपार्टिशन स्ट्रीम एक्सचेंज तक नहीं पहुंच जाता।

फिर, जैसा कि मर्ज में शामिल होने के लिए बाहरी (ऊपरी) इनपुट पर किया गया था, यह निर्माता पक्ष शुरू करता है नोड 11 . पर एक्सचेंज का , दो नए समानांतर कार्य बनाना .
यह शाखा डी को गति में सेट करता है (नीचे दिखाया गया है)। शाखा डी बिल्कुल वैसा ही निष्पादित करता है जैसा कि शाखा सी के लिए पहले से ही वर्णित है।

शाखा डी के लिए कार्य शुरू करने के तुरंत बाद, मूल कार्य प्रतीक्षा करता है CXPACKET . पर नए उत्पादकों के लिए एक्सचेंज पोर्ट खोलने के लिए नोड 11 पर:

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

इस बीच, शाखा C में निर्माता थ्रेड CXPACKET . पर प्रतीक्षा करना जारी रखते हैं नोड के उपभोक्ता पक्ष के लिए 5 पुनर्विभाजन धाराएँ खुले में एक्सचेंज करती हैं।

शाखा D खोलना

मूल कार्य शुरू होने के बाद शाखा डी के लिए निर्माता, क्वेरी प्रोफ़ाइल DMV नए निष्पादन संदर्भ (3 और 4) दिखाता है:

दो नए समानांतर कार्य शाखा डी में ठीक उसी तरह आगे बढ़ें जैसे शाखा सी में थे। प्रकार उनके सभी इनपुट का उपभोग करते हैं, और शाखा डी कार्य एक्सचेंज में वापस आ जाते हैं। यह मूल कार्य को उसके CXPACKET . से मुक्त करता है रुको। तब शाखा D के कर्मचारी CXPACKET . पर प्रतीक्षा करते हैं उपभोक्ता पक्ष समानांतर कार्यों को खोलने के लिए नोड 11 के निर्माता पक्ष में। वे समानांतर कार्यकर्ता (शाखा बी में) अभी तक मौजूद नहीं हैं।

चेकपॉइंट

इस बिंदु पर प्रतीक्षा कार्य नीचे दिखाए गए हैं:

शाखाओं सी और डी में समानांतर कार्यों के दोनों सेट CXPACKET . पर प्रतीक्षा कर रहे हैं अपने समानांतर कार्य के लिए उपभोक्ताओं को खोलने के लिए, पुनर्विभाजन धाराओं में क्रमशः नोड्स 5 और 11 का आदान-प्रदान होता है। केवल चलने योग्य कार्य पूरी क्वेरी में अभी मूल कार्य है ।

इस बिंदु पर क्वेरी प्रोफाइलर डीएमवी नीचे दिखाया गया है, शाखाओं सी और डी में ऑपरेटरों के साथ हाइलाइट किया गया है:

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

भाग 4 का अंत

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


  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. हैलोवीन समस्या - भाग 4

  3. PSDatabaseClone के साथ क्लोनिंग डेटाबेस

  4. Azure SQL प्रबंधित इंस्टेंस प्रदर्शन संबंधी विचार

  5. कॉलम-साइड इंप्लिक्ट रूपांतरण कितने महंगे हैं?