यह पांच-भाग श्रृंखला का अंतिम भाग है जो SQL सर्वर पंक्ति मोड समानांतर योजनाओं को निष्पादित करना शुरू करने के तरीके में गहरा गोता लगाता है। भाग 1 ने मूल कार्य के लिए निष्पादन संदर्भ शून्य को प्रारंभ किया, और भाग 2 ने क्वेरी स्कैन ट्री बनाया। भाग 3 ने क्वेरी स्कैन शुरू किया, कुछ प्रारंभिक चरण performed किया प्रसंस्करण, और शाखा सी में पहला अतिरिक्त समानांतर कार्य शुरू किया। भाग 4 में एक्सचेंज सिंक्रोनाइज़ेशन और समानांतर योजना शाखाओं सी एंड डी की शुरुआत का वर्णन किया गया है।
शाखा B समानांतर कार्य प्रारंभ
इस समानांतर योजना में शाखाओं का एक अनुस्मारक (विस्तार करने के लिए क्लिक करें):
निष्पादन क्रम में यह चौथा चरण है:
- शाखा ए (मूल कार्य)।
- शाखा सी (अतिरिक्त समानांतर कार्य)।
- शाखा डी (अतिरिक्त समानांतर कार्य)।
- शाखा बी (अतिरिक्त समानांतर कार्य)।
अभी एकमात्र थ्रेड सक्रिय है (CXPACKET
. पर निलंबित नहीं है) ) मूल कार्य . है , जो नोड 11 . पर पुनर्विभाजन स्ट्रीम एक्सचेंज के उपभोक्ता पक्ष में है शाखा बी में:
मूल कार्य अब नेस्टेड शुरुआती चरणों . से लौटता है कॉल, बीता हुआ और सीपीयू समय को प्रोफाइलर में सेट करना। पहले और अंतिम सक्रिय समय नहीं हैं प्रारंभिक चरण प्रसंस्करण के दौरान अद्यतन किया गया। याद रखें कि ये संख्याएं निष्पादन संदर्भ शून्य के विरुद्ध दर्ज की जा रही हैं - शाखा बी समानांतर कार्य अभी तक मौजूद नहीं हैं।
मूल कार्य आरोही नोड 11 से ट्री, नोड 10 पर स्ट्रीम एग्रीगेट के माध्यम से और नोड 3 पर मर्ज जॉइन करें, नोड 2 पर एकत्रित स्ट्रीम एक्सचेंज पर वापस जाएं।
प्रारंभिक चरण का संसाधन अब पूरा हो गया है ।
मूल EarlyPhases
. के साथ नोड 2 पर कॉल करें स्ट्रीम इकट्ठा करें एक्सचेंज आखिरकार पूरा होने पर, मूल कार्य उस एक्सचेंज को खोलने के लिए वापस आ जाता है (आप इस श्रृंखला की शुरुआत में दाईं ओर से उस कॉल को याद कर सकते हैं)। नोड 2 पर खुली विधि अब CQScanExchangeNew::StartAllProducers
को कॉल करती है समानांतर कार्य बनाने के लिए शाखा बी के लिए।
मूल कार्य अब प्रतीक्षा करता है CXPACKET
. पर उपभोक्ता . पर नोड 2 के किनारे स्ट्रीम इकट्ठा करें अदला-बदली। यह प्रतीक्षा तब तक जारी रहेगी जब तक कि नव-निर्मित शाखा बी कार्यों ने अपना नेस्टेड Open
. पूरा नहीं कर लिया है कॉल करता है और इकट्ठा स्ट्रीम एक्सचेंज के निर्माता पक्ष को खोलने के लिए वापस आ जाता है।
शाखा B समानांतर कार्य खुले हैं
शाखा B में दो नए समानांतर कार्य निर्माता . से प्रारंभ होते हैं नोड 2 के किनारे स्ट्रीम इकट्ठा करें अदला-बदली। सामान्य पंक्ति मोड पुनरावृत्त निष्पादन मॉडल के बाद, वे कॉल करते हैं:
CQScanXProducerNew::Open
(नोड 2 निर्माता पक्ष खुला)।CQScanProfileNew::Open
(नोड 3 के लिए प्रोफाइलर)।CQScanMergeJoinNew::Open
(नोड 3 मर्ज जॉइन)।CQScanProfileNew::Open
(नोड 4 के लिए प्रोफाइलर)।CQScanStreamAggregateNew::Open
(नोड 4 स्ट्रीम एग्रीगेट)।CQScanProfileNew::Open
(नोड 5 के लिए प्रोफाइलर)।CQScanExchangeNew::Open
(रिपार्टिशन स्ट्रीम एक्सचेंज)।
समानांतर कार्य दोनों मर्ज में शामिल होने के लिए बाहरी (ऊपरी) इनपुट का पालन करते हैं, जैसे प्रारंभिक चरण प्रसंस्करण ने किया था।
एक्सचेंज पूरा करना
जब शाखा B के कार्य उपभोक्ता . के पास पहुंचते हैं नोड 5 पर पुनर्विभाजन धाराओं का आदान-प्रदान, प्रत्येक कार्य:
- एक्सचेंज पोर्ट के साथ रजिस्टर (
CXPort
)। - पाइप बनाता है (
CXPipe
) जो इस कार्य को एक या अधिक उत्पादक पक्ष कार्यों (विनिमय के प्रकार के आधार पर) से जोड़ते हैं। वर्तमान एक्सचेंज एक पुनर्विभाजन धारा है, इसलिए प्रत्येक उपभोक्ता कार्य में दो पाइप (डीओपी 2 पर) होते हैं। प्रत्येक उपभोक्ता दो उत्पादकों में से किसी एक से पंक्तियाँ प्राप्त कर सकता है। - एक
CXPipeMerge
जोड़ता है विलय . करने के लिए कई पाइपों से पंक्तियाँ (चूंकि यह एक ऑर्डर-संरक्षण एक्सचेंज है)। - पंक्ति पैकेट बनाता है (भ्रामक रूप से नामित
CXPacket
) प्रवाह नियंत्रण के लिए और एक्सचेंज पाइपों में पंक्तियों को बफर करने के लिए उपयोग किया जाता है। इन्हें पहले दी गई क्वेरी मेमोरी से आवंटित किया जाता है।
एक बार जब दोनों उपभोक्ता-पक्ष समानांतर कार्य उस कार्य को पूरा कर लेते हैं, तो नोड 5 एक्सचेंज जाने के लिए तैयार है। दो उपभोक्ताओं (शाखा बी में) और दो उत्पादकों (शाखा सी में) ने एक्सचेंज पोर्ट खोला है, इसलिए नोड 5 CXPACKET
इंतजार खत्म ।
चेकपॉइंट
जैसे ही चीजें खड़ी होती हैं:
- मूल कार्य शाखा A . में प्रतीक्षा कर रहा है
CXPACKET
. पर नोड 2 के उपभोक्ता पक्ष में स्ट्रीम एक्सचेंज इकट्ठा करें। यह प्रतीक्षा तब तक जारी रहेगी जब तक दोनों नोड 2 निर्माता वापस नहीं आ जाते और एक्सचेंज को खोल नहीं देते। - दो समानांतर कार्य शाखा B . में चलाने योग्य हैं . उन्होंने नोड 5 पर रिपार्टिशन स्ट्रीम एक्सचेंज का उपभोक्ता पक्ष अभी खोला है।
- दो समानांतर कार्य शाखा C . में अभी-अभी उनके
CXPACKET
. से जारी किया गया है प्रतीक्षा करें, और अब चलाने योग्य . हैं . नोड 6 पर दो स्ट्रीम एग्रीगेट (एक प्रति समानांतर कार्य) नोड 7 पर दो प्रकार से पंक्तियों को एकत्रित करना शुरू कर सकते हैं। याद रखें कि इंडेक्स कुछ समय पहले नोड 9 को बंद कर देता है, जब सॉर्ट ने अपना इनपुट चरण पूरा कर लिया था। - दो समानांतर कार्य शाखा डी . में प्रतीक्षा कर रहे हैं
CXPACKET
. पर पुनर्विभाजन धारा के निर्माता पक्ष में नोड 11 पर विनिमय होता है। वे शाखा बी में दो समानांतर कार्यों द्वारा नोड 11 के उपभोक्ता पक्ष के खुलने की प्रतीक्षा कर रहे हैं। सूचकांक की तलाश बंद हो गई है, और प्रकार संक्रमण के लिए तैयार हैं उनका आउटपुट चरण।
एकाधिक सक्रिय शाखाएं
यह पहली बार है जब हमने एक ही समय में कई शाखाएं (बी और सी) सक्रिय की हैं, जिन पर चर्चा करना चुनौतीपूर्ण हो सकता है। सौभाग्य से, डेमो क्वेरी का डिज़ाइन ऐसा है कि शाखा C में स्ट्रीम एग्रीगेट केवल कुछ पंक्तियों का उत्पादन करेगा। संकीर्ण आउटपुट पंक्तियों की छोटी संख्या आसानी से पंक्ति पैकेट बफ़र्स . में फ़िट हो जाएगी नोड 5 पर पुनर्विभाजन धाराओं का आदान-प्रदान। इसलिए शाखा सी कार्य अपने काम के साथ (और अंततः बंद हो जाता है) नोड 5 पुनर्विभाजन स्ट्रीम उपभोक्ता पक्ष को किसी भी पंक्तियों को लाने के लिए प्रतीक्षा किए बिना प्राप्त कर सकते हैं।
आसानी से, इसका मतलब है कि हम दो शाखा सी समानांतर कार्यों को उनकी चिंता किए बिना पृष्ठभूमि में चलने दे सकते हैं। हमें केवल इस बात की चिंता करने की आवश्यकता है कि दो शाखा B समानांतर कार्य क्या कर रहे हैं।
शाखा B का उद्घाटन पूर्ण
शाखा बी का एक अनुस्मारक:
शाखा B में दो समानांतर कार्यकर्ता अपने Open
. से लौटते हैं नोड 5 पुनर्विभाजन धाराओं के आदान-प्रदान पर कॉल करता है। यह उन्हें वापस ले जाता है, हालांकि धारा 4 नोड पर एकत्रित होती है, नोड 3 पर मर्ज में शामिल होती है।
क्योंकि हम आरोही हैं Open
. में पेड़ विधि, नोड 5 और नोड 4 के ऊपर के प्रोफाइलर अंतिम सक्रिय recording रिकॉर्ड कर रहे हैं समय, साथ ही बीता हुआ और CPU समय (प्रति कार्य) जमा करना। हम अभी पैरेंट टास्क पर शुरुआती चरण निष्पादित नहीं कर रहे हैं, इसलिए निष्पादन संदर्भ शून्य के लिए दर्ज की गई संख्या प्रभावित नहीं होती हैं।
मर्ज में शामिल होने पर, दो शाखा बी समानांतर कार्य अवरोही शुरू करते हैं आंतरिक (निचला) इनपुट, उन्हें नोड 10 (और कुछ प्रोफाइलर्स) पर स्ट्रीम एग्रीगेट के माध्यम से नोड 11 पर रिपार्टिशन स्ट्रीम एक्सचेंज के उपभोक्ता पक्ष में ले जाता है।
शाखा D निष्पादन फिर से शुरू करता है
नोड 5 पर शाखा सी घटनाओं का दोहराव अब नोड 11 पुनर्विभाजन धाराओं पर होता है। नोड 11 एक्सचेंज का उपभोक्ता पक्ष पूरा हो गया है और खोला गया है। शाखा D में दो निर्माता अपना CXPACKET
. समाप्त करते हैं प्रतीक्षा करता है, चलाने योग्य . बन रहा है दोबारा। हम शाखा डी कार्यों को पृष्ठभूमि में चलने देंगे, उनके परिणामों को एक्सचेंज बफ़र्स में रखेंगे।
अब छः समानांतर कार्य हैं (शाखाओं बी, सी, और डी में दो-दो) इस क्वेरी में अतिरिक्त समानांतर कार्यों को सौंपे गए दो अनुसूचकों पर सहकारी रूप से समय साझा करना।
शाखा A का उद्घाटन पूरा होता है
शाखा B में दो समानांतर कार्य उनके Open
. से लौटते हैं नोड 11 पुनर्विभाजन स्ट्रीम एक्सचेंज पर कॉल, नोड 10 स्ट्रीम एग्रीगेट से ऊपर, नोड 3 पर मर्ज जॉइन के माध्यम से, और वापस स्ट्रीम इकट्ठा करें के निर्माता पक्ष में नोड 2 पर। प्रोफाइलर अंतिम सक्रिय और संचित बीता हुआ और CPU समय अपडेट किया जाता है क्योंकि हम नेस्टेड में पेड़ पर चढ़ते हैं Open
तरीके।
निर्माता . पर इकट्ठा स्ट्रीम एक्सचेंज के किनारे, दो शाखा बी समानांतर कार्य एक्सचेंज पोर्ट खोलने को सिंक्रनाइज़ करते हैं, फिर CXPACKET
पर प्रतीक्षा करें उपभोक्ता पक्ष खोलने के लिए।
मूल कार्य एकत्रित धाराओं के उपभोक्ता पक्ष की प्रतीक्षा अब रिलीज़ . है इसके CXPACKET
. से प्रतीक्षा करें, जो इसे उपभोक्ता पक्ष पर एक्सचेंज पोर्ट खोलने को पूरा करने की अनुमति देता है। यह बदले में उत्पादकों को उनके (संक्षिप्त) CXPACKET
. से मुक्त करता है रुको। नोड 2 एकत्रित धाराएं अब सभी स्वामियों द्वारा खोल दी गई हैं।
क्वेरी स्कैन पूरा करना
मूल कार्य अब संग्रह स्ट्रीम एक्सचेंज से क्वेरी स्कैन ट्री पर चढ़ता है, Open
. से लौटता है एक्सचेंज में कॉल, सेगमेंट , और अनुक्रम प्रोजेक्ट शाखा ए में ऑपरेटर।
यह उद्घाटन . को पूरा करता है क्वेरी स्कैन ट्री, जो कुछ समय पहले CQueryScan::StartupQuery
पर कॉल करके शुरू किया गया था . समानांतर योजना की सभी शाखाओं ने अब क्रियान्वित करना शुरू कर दिया है।
लौटने वाली पंक्तियां
निष्पादन योजना GetRow
. के जवाब में पंक्तियों को वापस करना शुरू करने के लिए तैयार है रूट . पर कॉल करता है CQueryScan::GetRow
. को कॉल करके शुरू किए गए क्वेरी स्कैन ट्री का . मैं पूर्ण विवरण में नहीं जा रहा हूँ, क्योंकि यह एक लेख के दायरे से पूरी तरह परे है कि कैसे समानांतर योजनाएं स्टार्ट अप ।
फिर भी, संक्षिप्त क्रम है:
- पेरेंट टास्क
GetRow
को कॉल करता है अनुक्रम प्रोजेक्ट पर, जोGetRow
. को कॉल करता है खंड पर, जोGetRow
. को कॉल करता है उपभोक्ता . पर एकत्रित धाराओं के किनारे का आदान-प्रदान। - यदि एक्सचेंज में अभी तक कोई पंक्ति उपलब्ध नहीं है, तो मूल कार्य प्रतीक्षा करता है
CXCONSUMER
. पर । - इस बीच, स्वतंत्र रूप से चलने वाली शाखा B समानांतर कार्य
GetRow
को बार-बार कॉल कर रहे हैं निर्माता . से शुरू एकत्रित धाराओं के किनारे का आदान-प्रदान। - पंक्तियों की आपूर्ति शाखा बी को नोड 5 और 12 पर पुनर्विभाजन स्ट्रीम एक्सचेंज के उपभोक्ता पक्षों द्वारा की जाती है।
- शाखाएं सी और डी अभी भी अपने संबंधित स्ट्रीम एग्रीगेट के माध्यम से पंक्तियों को संसाधित कर रहे हैं। शाखा B कार्यों को प्रतीक्षा . करना पड़ सकता है
CXCONSUMER
. पर पंक्तियों के एक पूरे पैकेट के उपलब्ध होने के लिए पुनर्विभाजन धाराओं में नोड्स 5 और 12 होते हैं। - नेस्टेड से निकलने वाली पंक्तियाँ
GetRow
शाखा B में कॉल को निर्माता . पर पंक्ति पैकेट में एकत्रित किया जाता है एकत्रित धाराओं के किनारे का आदान-प्रदान। - मूल कार्य का
CXCONSUMER
पैकेट के उपलब्ध होने पर उपभोक्ता पक्ष पर प्रतीक्षा करें जब एक पैकेट उपलब्ध हो जाता है। - एक समय में एक पंक्ति को मूल ऑपरेटरों के माध्यम से शाखा ए में संसाधित किया जाता है, और अंत में ग्राहक को।
- आखिरकार, पंक्तियां समाप्त हो जाती हैं, और एक नेस्टेड
Close
कॉल रिपल ट्री डाउन ट्री, एक्सचेंजों में, और समानांतर निष्पादन समाप्त हो जाता है।
सारांश और अंतिम नोट
सबसे पहले, इस विशेष समानांतर निष्पादन योजना के निष्पादन अनुक्रम का सारांश:
- मूल कार्य शाखा A opens खोलता है . प्रारंभिक चरण संग्रह स्ट्रीम एक्सचेंज में प्रसंस्करण शुरू होता है।
- पेरेंट टास्क के शुरुआती चरण के कॉल स्कैन ट्री को इंडेक्स सीक पर नोड 9 पर उतरते हैं, फिर नोड 5 पर रीपार्टिशनिंग एक्सचेंज पर वापस चढ़ते हैं।
- मूल कार्य शाखा C . के लिए समानांतर कार्य प्रारंभ करता है , तब प्रतीक्षा करता है जब वे नोड 7 पर सभी उपलब्ध पंक्तियों को ब्लॉकिंग सॉर्ट ऑपरेटरों में पढ़ते हैं।
- शुरुआती चरण कॉल मर्ज जॉइन पर चढ़ते हैं, फिर नोड 11 पर एक्सचेंज में आंतरिक इनपुट उतरते हैं।
- शाखा डी के लिए कार्य शाखा सी की तरह ही शुरू किया जाता है, जबकि मूल कार्य नोड 11 पर प्रतीक्षा करता है।
- शुरुआती चरण की कॉलें नोड 11 से जहां तक एकत्रित स्ट्रीम हैं, वापस आती हैं। प्रारंभिक चरण समाप्त यहाँ।
- मूल कार्य शाखा B . के लिए समानांतर कार्य बनाता है , और शाखा B के खुलने तक प्रतीक्षा करता है।
- शाखा बी कार्य नोड 5 पुनर्विभाजन धाराओं तक पहुंचते हैं, सिंक्रनाइज़ करते हैं, एक्सचेंज को पूरा करते हैं, और शाखा सी कार्यों को जारी करते हैं ताकि पंक्तियों को एकत्र करना शुरू किया जा सके।
- जब शाखा बी कार्य नोड 12 पुनर्विभाजन धाराओं तक पहुंचते हैं, तो वे सिंक्रनाइज़ करते हैं, एक्सचेंज को पूरा करते हैं, और शाखा डी कार्यों को सॉर्ट से एकत्रित करना शुरू करने के लिए जारी करते हैं।
- ब्रांच बी कार्य, एकत्रित स्ट्रीम एक्सचेंज में वापस आ जाते हैं और मूल कार्य को प्रतीक्षा से मुक्त करते हुए सिंक्रनाइज़ करते हैं। मूल कार्य अब क्लाइंट को पंक्तियों को वापस करने की प्रक्रिया शुरू करने के लिए तैयार है।
आप इस योजना के निष्पादन को संतरी वन प्लान एक्सप्लोरर में देखना पसंद कर सकते हैं। वास्तविक योजना संग्रह के "लाइव क्वेरी प्रोफाइल के साथ" विकल्प को सक्षम करना सुनिश्चित करें। प्लान एक्सप्लोरर के भीतर सीधे क्वेरी निष्पादित करने के बारे में अच्छी बात यह है कि आप अपनी गति से कई कैप्चर के माध्यम से कदम उठा सकेंगे, और यहां तक कि रिवाइंड भी कर सकेंगे। यह I/O, CPU का एक ग्राफिकल सारांश भी दिखाएगा, और लाइव क्वेरी प्रोफाइलिंग डेटा के साथ सिंक्रनाइज़ होने की प्रतीक्षा करेगा।
अतिरिक्त नोट
प्रारंभिक चरण प्रसंस्करण के दौरान क्वेरी स्कैन ट्री पर चढ़ना मूल कार्य के लिए प्रत्येक प्रोफाइलिंग इटरेटर पर पहले और अंतिम सक्रिय समय सेट करता है, लेकिन बीता हुआ या सीपीयू समय जमा नहीं करता है। Open
during के दौरान पेड़ पर चढ़ना और GetRow
समानांतर कार्य पर कॉल अंतिम सक्रिय समय सेट करता है, और प्रति कार्य प्रत्येक प्रोफाइलिंग इटरेटर पर बीता हुआ और CPU समय जमा करता है।
प्रारंभिक चरण प्रसंस्करण पंक्ति मोड समानांतर योजनाओं के लिए विशिष्ट है। यह सुनिश्चित करना आवश्यक है कि एक्सचेंजों को सही क्रम में प्रारंभ किया गया है, और सभी समानांतर मशीनरी सही ढंग से काम करती हैं।
मूल कार्य हमेशा संपूर्ण प्रारंभिक चरण प्रसंस्करण नहीं करता है। शुरुआती चरण रूट एक्सचेंज से शुरू होते हैं, लेकिन ये कॉल ट्री को कैसे नेविगेट करते हैं, यह सामने आने वाले इटरेटर्स पर निर्भर करता है। मैंने इस डेमो के लिए मर्ज जॉइन को चुना क्योंकि ऐसा होता है कि दोनों इनपुट के लिए प्रारंभिक चरण प्रसंस्करण की आवश्यकता होती है।
प्रारंभिक चरण (उदाहरण के लिए) समानांतर हैश केवल बिल्ड इनपुट को प्रचारित करते हैं। जब हैश अपने जांच चरण में संक्रमण में शामिल हो जाता है, तो यह खुलता है किसी भी एक्सचेंज सहित उस इनपुट पर इटरेटर। प्रारंभिक चरण प्रसंस्करण का एक और दौर शुरू किया गया है, (बिल्कुल) समानांतर कार्यों में से एक द्वारा नियंत्रित किया जाता है, जो मूल कार्य की भूमिका निभाता है।
जब प्रारंभिक चरण प्रसंस्करण एक समानांतर शाखा का सामना करता है जिसमें एक अवरुद्ध पुनरावृत्त होता है, तो यह उस शाखा के लिए अतिरिक्त समानांतर कार्य शुरू करता है, और उन उत्पादकों के अपने शुरुआती चरण को पूरा करने की प्रतीक्षा करता है। उस शाखा में बाल शाखाएं भी हो सकती हैं, जिन्हें उसी तरह से पुनरावर्ती रूप से संभाला जाता है।
एक पंक्ति मोड समानांतर योजना में कुछ शाखाओं को एक ही धागे पर चलाने की आवश्यकता हो सकती है (उदाहरण के लिए वैश्विक कुल या शीर्ष के कारण)। ये 'सीरियल ज़ोन' एक अतिरिक्त 'समानांतर' कार्य पर भी चलते हैं, केवल एक ही कार्य, निष्पादन संदर्भ और उस शाखा के लिए कार्यकर्ता का अंतर है। शाखा को सौंपे गए कार्यों की संख्या की परवाह किए बिना प्रारंभिक चरण प्रसंस्करण समान कार्य करता है। उदाहरण के लिए, एक 'सीरियल ज़ोन' मूल कार्य (या उस भूमिका को निभाने वाला समानांतर कार्य) के साथ-साथ एकल अतिरिक्त कार्य के लिए समय की रिपोर्ट करता है। यह शोप्लान में "थ्रेड 0" (शुरुआती चरणों) के साथ-साथ "थ्रेड 1" (अतिरिक्त कार्य) के डेटा के रूप में प्रकट होता है।
समापन विचार
यह सब निश्चित रूप से जटिलता की एक अतिरिक्त परत का प्रतिनिधित्व करता है। उस निवेश पर रिटर्न रनटाइम संसाधन उपयोग (मुख्य रूप से थ्रेड्स और मेमोरी) में है, कम सिंक्रोनाइज़ेशन प्रतीक्षा, बढ़ा हुआ थ्रूपुट, संभावित सटीक प्रदर्शन मेट्रिक्स, और इंट्रा-क्वेरी समानांतर गतिरोध की कम से कम संभावना है।
हालाँकि पंक्ति मोड समानांतरवाद को अधिक आधुनिक बैच मोड समानांतर निष्पादन इंजन द्वारा ग्रहण किया गया है, फिर भी पंक्ति मोड डिज़ाइन में इसकी एक निश्चित सुंदरता है। अधिकांश पुनरावर्तक यह दिखावा करते हैं कि वे अभी भी एक धारावाहिक योजना में चल रहे हैं, लगभग सभी सिंक्रनाइज़ेशन, प्रवाह नियंत्रण और शेड्यूलिंग एक्सचेंजों द्वारा नियंत्रित किए जाते हैं। प्रारंभिक चरण प्रसंस्करण जैसे कार्यान्वयन विवरणों में स्पष्ट देखभाल और ध्यान व्यावहारिक कठिनाइयों पर बहुत अधिक विचार किए बिना क्वेरी डिजाइनर के बिना सफलतापूर्वक निष्पादित करने के लिए सबसे बड़ी समानांतर योजनाओं को भी सक्षम बनाता है।