हैश एग्रीगेट बेलआउट


10

एक प्रश्न जो एक चैट चर्चा में उत्पन्न हुआ:

मुझे पता है कि हैश को एक तरह से नेस्टेड लूप्स की तरह से जमानतदार स्विच से जोड़ा जाता है।

एक हैश एग्रीगेट बेलआउट के लिए SQL सर्वर क्या करता है (यदि यह बिल्कुल भी हो सकता है)?

जवाबों:


11

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

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

वह हैश रिकर्सन के बारे में बात करता है:

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

बेलआउट

हैश बेलआउट को हल्के ढंग से प्रलेखित किया गया है, लेकिन नाचो अलोंसो पोर्टिलो द्वारा व्हाट्सएप में अधिकतम समय के लिए उल्लेख किया गया है , जो हैश के लिए पुनरावृत्ति का अधिकतम स्तर है?

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

"हैश स्कैन ऑपरेटर" में उल्लिखित आंतरिक वर्ग का संदर्भ CQScanHashहै sqlmin.dll। यह वर्ग हैश ऑपरेटर (इसके सभी रूपों में, आंशिक समुच्चय और प्रवाह अलग सहित) के कार्यान्वयन का नेतृत्व करता है जिसे हम निष्पादन योजनाओं में देखते हैं।

बेलआउट एल्गोरिथ्म

यह हमें आपके प्रश्नों के दिल में लाता है - बिलआउट एल्गोरिथ्म वास्तव में क्या करता है? क्या यह "सॉर्ट आधारित" है या "नेस्टेड लूप्स चीज़ की तरह" पर आधारित है?

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

एक बी-ट्री के लिए अनियंत्रित आवेषण की यह श्रृंखला समान रूप से एक सम्मिलन प्रकार के रूप में या एक अनुक्रमित नेस्टेड लूप लुकअप के रूप में देखी जा सकती है ।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.