यह पांच-भाग श्रृंखला SQL सर्वर पंक्ति मोड समानांतर योजनाओं के शुरू होने के तरीके में एक गहरा गोता लगाती है। यह पहला भाग समानांतर निष्पादन के लिए योजना तैयार करने में मूल कार्य (समन्वयक) की भूमिका को शामिल करता है। इसमें प्रत्येक ऑपरेटर को इनिशियलाइज़ करना, और वास्तविक पंक्ति गणना और बीता हुआ समय जैसे रनटाइम प्रदर्शन डेटा एकत्र करने के लिए छिपे हुए प्रोफाइलर जोड़ना शामिल है।
सेटअप
विश्लेषण के लिए एक ठोस आधार प्रदान करने के लिए, हम अनुसरण करेंगे कि एक विशेष समानांतर क्वेरी कैसे निष्पादन शुरू करती है। मैंने सार्वजनिक स्टैक ओवरफ़्लो 2013 . का उपयोग किया डेटाबेस (विवरण डाउनलोड करें)। वांछित योजना आकार छोटे स्टैक ओवरफ्लो 2010 डेटा सेट के विरुद्ध भी प्राप्त किया जा सकता है यदि यह अधिक सुविधाजनक है। इसे उसी लिंक से डाउनलोड किया जा सकता है। मैंने एक गैर-संकुल अनुक्रमणिका जोड़ी:
CREATE NONCLUSTERED INDEX PP ON dbo.Posts ( PostTypeId ASC, CreationDate ASC );
मेरा परीक्षण वातावरण है SQL Server 2019 CU9 उदाहरण के लिए आवंटित 8 कोर और 16GB मेमोरी वाले लैपटॉप पर। संगतता स्तर 150 विशेष रूप से प्रयोग किया जाता है। यदि आप चाहें तो लक्ष्य योजना को पुन:पेश करने में आपकी सहायता के लिए मैं उन विवरणों का उल्लेख करता हूं। पंक्ति मोड समानांतर निष्पादन के मूल सिद्धांत SQL सर्वर 2005 के बाद से नहीं बदले हैं, इसलिए निम्नलिखित चर्चा व्यापक रूप से लागू होती है।
परीक्षण क्वेरी महीने और वर्ष के आधार पर समूहीकृत प्रश्नों और उत्तरों की कुल संख्या लौटाती है:
WITH MonthlyPosts AS ( SELECT P.PostTypeId, CA.TheYear, CA.TheMonth, Latest = MAX(P.CreationDate) FROM dbo.Posts AS P CROSS APPLY ( VALUES ( YEAR(P.CreationDate), MONTH(P.CreationDate) ) ) AS CA (TheYear, TheMonth) GROUP BY P.PostTypeId, CA.TheYear, CA.TheMonth ) SELECT rn = ROW_NUMBER() OVER ( ORDER BY Q.TheYear, Q.TheMonth), Q.TheYear, Q.TheMonth, LatestQuestion = Q.Latest, LatestAnswer = A.Latest FROM MonthlyPosts AS Q JOIN MonthlyPosts AS A ON A.TheYear = Q.TheYear AND A.TheMonth = Q.TheMonth WHERE Q.PostTypeId = 1 AND A.PostTypeId = 2 ORDER BY Q.TheYear, Q.TheMonth OPTION ( USE HINT ('DISALLOW_BATCH_MODE'), USE HINT ('FORCE_DEFAULT_CARDINALITY_ESTIMATION'), ORDER GROUP, MAXDOP 2 );
मैंने एक विशेष आकार पंक्ति मोड योजना प्राप्त करने के लिए संकेतों का उपयोग किया है। बाद में दिखाए गए कुछ विवरणों को और संक्षिप्त बनाने के लिए निष्पादन डीओपी 2 तक सीमित है।
अनुमानित निष्पादन योजना है (विस्तार करने के लिए क्लिक करें):
पृष्ठभूमि
क्वेरी ऑप्टिमाइज़र बैच के लिए एकल संकलित योजना तैयार करता है। योग्यता और अनुमानित लागतों के आधार पर बैच में प्रत्येक स्टेटमेंट को सीरियल या समानांतर निष्पादन के लिए चिह्नित किया गया है।
समानांतर योजना में एक्सचेंज . शामिल हैं (समानांतरता ऑपरेटरों)। एक्सचेंज डिस्ट्रीब्यूट स्ट्रीम . में दिखाई दे सकते हैं , पुनर्विभाजन धाराएं , या स्ट्रीम इकट्ठा करें प्रपत्र। इनमें से प्रत्येक एक्सचेंज प्रकार एक ही अंतर्निहित घटकों का उपयोग करता है, बस अलग-अलग तरीके से अलग-अलग इनपुट और आउटपुट के साथ वायर्ड होता है। पंक्ति मोड पर अधिक पृष्ठभूमि के लिए समानांतर निष्पादन देखें समानांतर निष्पादन योजनाएँ - शाखाएँ और सूत्र।
DOP डाउनग्रेड
समानांतर योजना के लिए समानांतरवाद की डिग्री (डीओपी) यदि आवश्यक हो तो रनटाइम पर डाउनग्रेड किया जा सकता है। एक समानांतर क्वेरी DOP 8 का अनुरोध करना शुरू कर सकती है, लेकिन उस समय सिस्टम संसाधनों की कमी के कारण उत्तरोत्तर DOP 4, DOP 2, और अंत में DOP 1 में डाउनग्रेड किया जा सकता है। अगर आप इसे काम करते हुए देखना चाहते हैं, तो एरिक डार्लिंग का यह छोटा वीडियो देखें।
एकल थ्रेड पर समानांतर योजना चलाना तब भी हो सकता है जब एक कैश्ड समानांतर योजना का पुन:उपयोग एक सत्र द्वारा किया जाता है जो पर्यावरण सेटिंग (जैसे एफ़िनिटी मास्क या संसाधन गवर्नर) द्वारा डीओपी 1 तक सीमित है। देखें मिथक:SQL सर्वर विवरण के लिए प्रत्येक समानांतर योजना के साथ एक सीरियल प्लान को कैश करता है।
कारण जो भी हो, कैश्ड समानांतर योजना का DOP डाउनग्रेड नहीं . करता है परिणामस्वरूप एक नई धारावाहिक योजना संकलित की जा रही है। SQL सर्वर अक्षम . द्वारा मौजूदा समानांतर योजना का पुन:उपयोग करता है एक्सचेंज। परिणाम एक 'समानांतर' योजना है जो एक ही धागे पर क्रियान्वित होती है। एक्सचेंज अभी भी योजना में दिखाई देते हैं, लेकिन उन्हें रनटाइम पर बायपास कर दिया जाता है।
SQL सर्वर रनटाइम पर एक्सचेंज जोड़कर समानांतर निष्पादन के लिए सीरियल प्लान को बढ़ावा नहीं दे सकता है। इसके लिए एक नए संकलन की आवश्यकता होगी।
समानांतर योजना आरंभीकरण
एक समानांतर योजना में अतिरिक्त वर्कर थ्रेड का उपयोग करने के लिए आवश्यक सभी एक्सचेंज हैं, लेकिन अतिरिक्त सेटअप कार्य है समानांतर निष्पादन शुरू होने से पहले रनटाइम पर आवश्यक है। एक स्पष्ट उदाहरण यह है कि योजना के भीतर विशिष्ट कार्यों के लिए अतिरिक्त कार्यकर्ता धागे आवंटित किए जाने चाहिए, लेकिन इसके अलावा भी बहुत कुछ है।
मैं उस बिंदु पर शुरू करने जा रहा हूं जहां योजना कैश से समानांतर योजना पुनर्प्राप्त की गई है। इस बिंदु पर, वर्तमान अनुरोध को संसाधित करने वाला केवल मूल थ्रेड मौजूद है। समानांतर योजनाओं में इस धागे को कभी-कभी "समन्वयक सूत्र" कहा जाता है, लेकिन मैं "मूल कार्य" शब्दों को प्राथमिकता देता हूं। "या" मूल कार्यकर्ता "। इस धागे के बारे में अन्यथा कुछ खास नहीं है; यह वही थ्रेड है जो कनेक्शन क्लाइंट अनुरोधों को संसाधित करने और सीरियल योजनाओं को पूरा करने के लिए चलाने के लिए उपयोग करता है।
इस बात पर जोर देने के लिए कि केवल एक धागा मौजूद है अभी, मैं चाहता हूं कि आप इस समय योजना की कल्पना इस तरह करें:
मैं इस पोस्ट में लगभग विशेष रूप से संतरी वन प्लान एक्सप्लोरर के स्क्रीनशॉट का उपयोग करूंगा, लेकिन केवल इस पहले दृश्य के लिए, मैं SSMS संस्करण भी दिखाऊंगा:
किसी भी प्रतिनिधित्व में, मुख्य अंतर प्रत्येक ऑपरेटर पर समानता आइकन की कमी है, भले ही एक्सचेंज अभी भी मौजूद हैं। मूल कनेक्शन थ्रेड पर चल रहा है, अभी केवल मूल कार्य मौजूद है। कोई अतिरिक्त वर्कर थ्रेड नहीं अभी तक आरक्षित, निर्मित या असाइन किए गए कार्य हैं। जैसा कि हम आगे बढ़ते हैं, उपरोक्त योजना प्रतिनिधित्व को दिमाग के सामने रखें।
निष्पादन योग्य योजना बनाना
इस बिंदु पर योजना अनिवार्य रूप से केवल एक टेम्पलेट . है जिसका उपयोग भविष्य में किसी भी निष्पादन के लिए आधार के रूप में किया जा सकता है। इसे एक विशिष्ट रन के लिए तैयार करने के लिए, SQL सर्वर को रनटाइम मान जैसे वर्तमान उपयोगकर्ता, लेनदेन संदर्भ, पैरामीटर मान, रनटाइम पर बनाए गए किसी भी ऑब्जेक्ट के लिए आईडी (जैसे अस्थायी टेबल और चर), और इसी तरह भरने की आवश्यकता होती है।
समानांतर योजना के लिए, SQL सर्वर को आंतरिक मशीनरी को उस बिंदु पर लाने के लिए काफी अतिरिक्त प्रारंभिक कार्य करने की आवश्यकता होती है जहां निष्पादन शुरू हो सकता है। मूल कार्य का कार्यकर्ता धागा लगभग सभी कार्यों को करने के लिए जिम्मेदार है (और निश्चित रूप से सभी कार्य जो हम भाग 1 में शामिल करेंगे)।
एक विशिष्ट रन के लिए योजना टेम्पलेट को बदलने की प्रक्रिया को निष्पादन योग्य योजना . बनाने के रूप में जाना जाता है . शब्दावली को सीधा रखना कभी-कभी मुश्किल होता है, क्योंकि शब्द अक्सर अतिभारित और गलत तरीके से लागू होते हैं (यहां तक कि माइक्रोसॉफ्ट द्वारा भी), लेकिन मैं यथासंभव सुसंगत रहने की पूरी कोशिश करूंगा।
निष्पादन संदर्भ
आप एक निष्पादन प्रसंग . के बारे में सोच सकते हैं एक विशेष थ्रेड द्वारा आवश्यक सभी विशिष्ट रनटाइम जानकारी के साथ पॉप्युलेट किए गए एक योजना टेम्पलेट के रूप में। निष्पादन योग्य योजना एक धारावाहिक . के लिए कथन में एक एकल निष्पादन संदर्भ होता है, जहां एक एकल धागा पूरी योजना को चलाता है।
एक समानांतर निष्पादन योग्य योजना में निष्पादन संदर्भों . का संग्रह होता है :मूल कार्य के लिए एक, और प्रत्येक समानांतर शाखा में प्रति थ्रेड एक। प्रत्येक अतिरिक्त समानांतर वर्कर थ्रेड समग्र योजना के अपने हिस्से को अपने निष्पादन संदर्भ में चलाता है। उदाहरण के लिए, डीओपी 8 पर चलने वाली तीन शाखाओं वाली समानांतर योजना में (1 + (3 * 8)) =25 निष्पादन संदर्भ हैं। सीरियल निष्पादन संदर्भ पुन:उपयोग के लिए कैश किए जाते हैं, लेकिन अतिरिक्त समानांतर निष्पादन संदर्भ नहीं हैं।
मूल कार्य हमेशा किसी भी अतिरिक्त समानांतर कार्यों से पहले मौजूद होता है, इसलिए इसे निष्पादन संदर्भ शून्य असाइन किया जाता है . पैरेंट संदर्भ पूरी तरह से प्रारंभ होने के बाद, समानांतर श्रमिकों द्वारा उपयोग किए जाने वाले निष्पादन संदर्भ बाद में बनाए जाएंगे। अतिरिक्त संदर्भ क्लोन . हैं मूल संदर्भ से, फिर उनके विशिष्ट कार्य के लिए अनुकूलित (यह भाग 2 में शामिल है)।
निष्पादन संदर्भ शून्य शुरू करने में कई गतिविधियां शामिल हैं। उन सभी को सूचीबद्ध करने का प्रयास करना अव्यावहारिक है, लेकिन हमारी परीक्षण क्वेरी पर लागू कुछ मुख्य बातों को शामिल करना उपयोगी होगा। एक सूची के लिए अभी भी बहुत सारे होंगे, इसलिए मैं उन्हें (कुछ हद तक मनमाना) खंडों में तोड़ दूंगा:
1. जनक संदर्भ आरंभीकरण
जब हम निष्पादन के लिए कथन प्रस्तुत करते हैं, तो मूल कार्य का संदर्भ (निष्पादन संदर्भ शून्य) के साथ आरंभ किया जाता है:
- आधार लेनदेन का संदर्भ (स्पष्ट, निहित, या स्वतः-प्रतिबद्ध)। समानांतर कार्यकर्ता उप-लेनदेन चलाएंगे, लेकिन वे सभी मूल लेनदेन के दायरे में हैं।
- बयान की सूची पैरामीटर और उनके वर्तमान मूल्य।
- एक प्राथमिक स्मृति वस्तु (पीएमओ) स्मृति अनुदान और आवंटन का प्रबंधन करता था।
- एक लिंक किया गया नक्शा निष्पादन योग्य योजना में ऑपरेटरों (क्वेरी नोड्स) की।
- किसी भी आवश्यक बड़ी वस्तु के लिए एक कारखाना (बूँद) हैंडल।
- निष्पादन के दौरान एक अवधि के लिए रखे गए एकाधिक तालों का ट्रैक रखने के लिए कक्षाएं लॉक करें। सभी योजनाओं के लिए कक्षाओं को लॉक करना require आवश्यक नहीं है चूंकि पूरी तरह से स्ट्रीमिंग ऑपरेटर आमतौर पर अलग-अलग पंक्तियों को क्रम से लॉक और अनलॉक करते हैं।
- अनुमानित स्मृति अनुदान क्वेरी के लिए।
- पंक्ति मोड स्मृति अनुदान प्रतिक्रिया प्रत्येक ऑपरेटर के लिए संरचनाएं (SQL सर्वर 2019)।
इनमें से कई चीजें बाद में समानांतर कार्यों द्वारा उपयोग या संदर्भित की जाएंगी, इसलिए उन्हें पहले मूल दायरे में मौजूद होना चाहिए।
2. अभिभावक संदर्भ मेटाडेटा
प्रदर्शन किए गए अगले मुख्य कार्य हैं:
- अनुमानित क्वेरी लागत की जांच करना क्वेरी गवर्नर लागत सीमा कॉन्फ़िगरेशन विकल्पों द्वारा निर्धारित सीमा के भीतर है।
- अपडेट कर रहा है इंडेक्स उपयोग रिकॉर्ड -
sys.dm_db_index_usage_stats
. के माध्यम से उजागर । - संचित अभिव्यक्ति मान (रनटाइम स्थिरांक) बनाना।
- प्रोफाइलिंग ऑपरेटरों की सूची बनाना यदि यह वर्तमान निष्पादन के लिए अनुरोध किया गया है, तो पंक्ति गणना और समय जैसे रनटाइम मीट्रिक एकत्र करने के लिए उपयोग किया जाता है। प्रोफाइलर स्वयं अभी तक नहीं बने हैं, केवल सूची है।
- प्रतीक्षा का स्नैपशॉट लेना सत्र प्रतीक्षा सुविधा के लिए
sys.dm_exec_session_wait_stats
के माध्यम से उजागर किया गया ।
3. डीओपी और मेमोरी ग्रांट
मूल कार्य संदर्भ अब:
- समानांतरता की रनटाइम डिग्री की गणना करता है (DOP ) यह मुक्त श्रमिकों की संख्या (पहले "डीओपी डाउनग्रेड" देखें) से प्रभावित होता है, जहां उन्हें नोड्स और कई ट्रेस फ्लैग के बीच रखा जा सकता है।
- आवश्यक संख्या में थ्रेड्स को सुरक्षित रखता है। यह कदम शुद्ध लेखांकन है - इस बिंदु पर धागे स्वयं मौजूद नहीं हो सकते हैं। SQL सर्वर अधिकतम संख्या में थ्रेड्स का ट्रैक रखता है जिसकी उसे अनुमति है। सूत्र आरक्षित करना उस संख्या से घटाता है। जब थ्रेड समाप्त हो जाते हैं, तो अधिकतम संख्या फिर से बढ़ा दी जाती है।
- स्मृति अनुदान समयबाह्य सेट करता है ।
- एक्सचेंज बफ़र्स के लिए आवश्यक मेमोरी सहित मेमोरी ग्रांट की गणना करता है।
- उपयुक्त संसाधन सेमाफोर के माध्यम से स्मृति अनुदान प्राप्त करता है ।
- समानांतर उपप्रक्रियाओं को संभालने के लिए प्रबंधक ऑब्जेक्ट बनाता है . मूल कार्य शीर्ष-स्तरीय प्रक्रिया है; अतिरिक्त कार्यों को उपप्रक्रियाओं . के रूप में भी जाना जाता है ।
जबकि इस बिंदु पर थ्रेड 'आरक्षित' हैं, SQL सर्वर अभी भी THREADPOOL
का सामना कर सकता है बाद में प्रतीक्षा करता है जब वह 'आरक्षित' धागे में से किसी एक का उपयोग करने का प्रयास करता है। आरक्षण गारंटी देता है कि SQL सर्वर हर समय अपने कॉन्फ़िगर किए गए अधिकतम थ्रेड्स के आसपास रहेगा, लेकिन भौतिक थ्रेड थ्रेड पूल से तुरंत उपलब्ध नहीं हो सकता है। . जब ऐसा होता है, तो ऑपरेटिंग सिस्टम द्वारा एक नया थ्रेड शुरू करने की आवश्यकता होगी, जिसमें थोड़ा समय लग सकता है। उस पर और अधिक के लिए, जोश डारनेल द्वारा असामान्य थ्रेडपूल वेट्स देखें।
4. क्वेरी स्कैन सेटअप
पंक्ति मोड योजनाएँ पुनरावृत्ति में निष्पादित होती हैं फैशन, जड़ से शुरू। इस समय हमारे पास जो योजना है, वह अभी तक इस विधा को क्रियान्वित करने में सक्षम नहीं है। यह अभी भी काफी हद तक एक टेम्प्लेट है, भले ही इसमें पहले से ही निष्पादन-विशिष्ट जानकारी की उचित मात्रा हो।
SQL सर्वर को वर्तमान संरचना को पुनरावृत्तियों . के ट्री में बदलने की आवश्यकता है , प्रत्येक में Open
. जैसी विधियां हैं , GetRow
, और Close
. फ़ंक्शन पॉइंटर्स के माध्यम से इटरेटर विधियां अपने बच्चों से जुड़ी होती हैं। उदाहरण के लिए, GetRow
calling पर कॉल करना रूट पर पुनरावर्ती रूप से GetRow
को कॉल करता है चाइल्ड ऑपरेटरों पर जब तक एक पत्ती का स्तर नहीं पहुंच जाता है और एक पंक्ति पेड़ को 'बुलबुला' करने लगती है। विवरण पर एक पुनश्चर्या के लिए इटरेटर, क्वेरी प्लान, और वे पीछे की ओर क्यों चलते हैं देखें।
भाग 1 का अंत
हमने मूल कार्य के लिए निष्पादन संदर्भ स्थापित करने में अच्छी प्रगति की है। भाग 2 में, हम अनुसरण करेंगे क्योंकि SQL सर्वर पुनरावृत्त निष्पादन के लिए आवश्यक क्वेरी स्कैन ट्री का निर्माण करता है।