SQL सर्वर क्वेरी के लिए डेटा को कैसे संभालता है जहां बफर कैश में पर्याप्त जगह नहीं है?


10

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

मैं एक उदाहरण दूंगा। मान लें कि आपके पास SQL ​​Server इंस्टेंस है जिसमें 6GB कुल बफ़र कैश स्पेस उपलब्ध है। मैं कई जोड़ के साथ एक क्वेरी चलाता हूं जो 7GB डेटा पढ़ता है, SQL सर्वर इस अनुरोध का जवाब देने में कैसे सक्षम है? क्या यह अस्थायी रूप से डेटा को टेम्पर्ड बीडी में स्टोर करता है? क्या यह विफल रहता है? क्या यह कुछ ऐसा करता है जो सिर्फ डिस्क से डेटा पढ़ता है और एक समय में सेगमेंट को संकलित करता है?

इसके अलावा, यदि मैं कुल डेटा के 7GB को वापस करने की कोशिश कर रहा हूं, तो क्या होता है कि SQL सर्वर इसे कैसे संभालता है?

मुझे यह पता करने के कई तरीकों के बारे में पहले से पता है, मैं बस उत्सुक हूं कि SQL सर्वर इस अनुरोध को आंतरिक रूप से कैसे संभालता है जब यह कहा गया है।

इसके अलावा, मुझे यकीन है कि यह जानकारी कहीं मौजूद है, लेकिन मैं इसे खोजने में असफल रहा हूं।


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

जवाबों:


13

पृष्ठों को आवश्यकतानुसार मेमोरी में पढ़ा जाता है, यदि कोई मुफ्त मेमोरी उपलब्ध नहीं है, तो सबसे पुराना अनमॉडिफाइड पेज को आने वाले पेज से बदल दिया जाता है।

इसका मतलब है कि यदि आप किसी क्वेरी को निष्पादित करते हैं जिसके लिए मेमोरी में अधिक डेटा की आवश्यकता होती है, तो कई पेज मेमोरी में बहुत कम जीवन जीएंगे, जिसके परिणामस्वरूप बहुत सारे I / O हो जाएंगे।

आप Windows प्रदर्शन मॉनिटर में "पृष्ठ जीवन प्रत्याशा" काउंटर को देखकर इस आशय को देख सकते हैं। को देखो https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy कि काउंटर के बारे में कुछ महान जानकारी के लिए।

टिप्पणियों में, आपने विशेष रूप से पूछा कि क्या होता है जब क्वेरी के परिणाम उपलब्ध बफर स्थान से बड़े होते हैं। सबसे सरल उदाहरण लें, select * from some_very_big_table;- मान लें कि तालिका 32GB है, और max server memory (MB)24GB पर कॉन्फ़िगर किया गया है। सभी 32GB टेबल डेटा को पृष्ठ बफर में एक समय में, लैच किए गए पेजों में पढ़ा जाएगा, नेटवर्क पैकेट में स्वरूपित, और तार भर भेजा। यह पृष्ठ-दर-पृष्ठ होता है; आपके पास एक ही समय में 300 ऐसे प्रश्न चल सकते हैं, और यह मानते हुए कि कोई अवरोध उत्पन्न नहीं हो रहा है, प्रत्येक क्वेरी के लिए डेटा पृष्ठ बफर स्पेस, एक समय में एक पृष्ठ में पढ़ा जाएगा, और ग्राहक को जितनी जल्दी हो सके तार पर रखा जा सकता है। अनुरोध और डेटा की खपत। एक बार जब प्रत्येक पृष्ठ का सारा डेटा तार पर भेज दिया जाता है, तो पृष्ठ अनियंत्रित हो जाता है, और बहुत जल्दी डिस्क के साथ किसी अन्य पृष्ठ से बदल दिया जाएगा।

अधिक जटिल क्वेरी के मामले में, उदाहरण के लिए कई तालिकाओं से परिणामों को एकत्र करने के लिए कहें, पृष्ठों को ठीक उसी तरह मेमोरी में खींचा जाएगा जैसा कि क्वेरी प्रोसेसर द्वारा आवश्यक है। यदि क्वेरी प्रोसेसर को परिणामों की गणना करने के लिए अस्थायी कार्य स्थान की आवश्यकता होती है, तो यह पता चलेगा कि जब यह क्वेरी के लिए एक योजना का संकलन करता है, और SQLOS से कार्य स्थान (मेमोरी) का अनुरोध करेगा । SQLOS कुछ बिंदु पर होगा (यह मानते हुए कि यह समय समाप्त नहीं होता है ), उस मेमोरी को क्वेरी प्रोसेसर को अनुदान दें, जिस बिंदु पर क्वेरी प्रोसेसिंग फिर से शुरू होगी। यदि क्वेरी प्रोसेसर SQLOS से कितनी मेमोरी मांगता है, इसके अनुमान में गलती करता है, तो उसे "डिस्क पर स्पेल" करने की आवश्यकता हो सकती हैसंचालन, जहां डेटा अस्थायी रूप से एक मध्यवर्ती रूप में tempdb में लिखा जाता है। जिन पृष्ठों को tempdb पर लिखा गया है, उन्हें एक बार अनप्लग कर दिया जाएगा, जब वे मेमोरी में पढ़ने के लिए अन्य पृष्ठों के लिए जगह बनाने के लिए tempdb को लिखे जाएंगे। आखिरकार क्वेरी प्रक्रिया टेम्पर्ड बीडी में संग्रहीत डेटा पर वापस आ जाएगी, पेजिंग में बफर मुक्त करने वाले पृष्ठों में पेजिंग में उपयोग करते हुए पेजिंग।

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


जिज्ञासा से बाहर, 7GB डेटा किस तरह की क्वेरी खींच रहा है? मुझे उम्मीद है कि यह एक बैच प्रक्रिया है।
दातागोड़

शायद कई नहीं और आप सही हैं यह उम्मीद है कि एक बैच प्रक्रिया होगी। मैं यह देखने के लिए उत्सुक था कि एसक्यूएल उस अनुरोध को कैसे संभालेगा
डस्टिन

5

इस परिदृश्य में आपकी क्वेरी वास्तव में क्या करेगी, मैं नहीं बोल सकता, लेकिन SQL सर्वर के पास कई विकल्प हैं जो इस बात पर निर्भर करता है कि कितना आवश्यक है।

  • डेटा TempDB के लिए "फैल" कर सकते हैं, यह आपकी डिस्क का उपयोग होगा
  • पुराने पन्नों को आपके बफर कैश से बाहर धकेला जा सकता है
  • SQL सर्वर कैश को बफर करने के लिए कुछ पेज लोड कर सकता है, उनका उपयोग कर सकता है, फिर नए पेजों को घुमा सकता है

यह पता लगाने का सबसे अच्छा तरीका क्या होगा कि देव माहौल में परिदृश्य बनाएं और पता करें।


2

मेरा सवाल यह है कि SQL सर्वर एक क्वेरी को कैसे संभालता है जिसमें बफर कैश में अधिक मात्रा में डेटा खींचने की आवश्यकता होती है, फिर स्थान उपलब्ध होता है

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

संपादित करें

मुझे वह मिलता है, लेकिन जो हिस्सा मुझे थोड़ा परेशान करता है वह यह है कि अगर आप डेटा को फ़िल्टर कर रहे हैं और उन परिणामों को कैश के आकार से अधिक हो जाता है।

ज्वाइनिंग और फ़िल्टरिंग के लिए स्मृति क्वेरी रन से पहले भी तय की जाती है और मान लीजिए कि वास्तव में एक मेमोरी क्रंच है और ऑपरेशन चलाने के लिए आवश्यक मेमोरी उपलब्ध नहीं है SQL सर्वर प्रोसेसर "आवश्यक मेमोरी" प्रदान करेगा

आवश्यक मेमोरी: सॉर्ट और हैश जॉइन करने के लिए न्यूनतम मेमोरी आवश्यक है। इसे आवश्यक कहा जाता है क्योंकि इस मेमोरी के बिना कोई क्वेरी उपलब्ध नहीं होगी। SQL सर्वर इस मेमोरी का उपयोग सॉर्ट और हैश जॉइन को संभालने के लिए आंतरिक डेटा स्ट्रक्चर्स बनाने के लिए करता है।

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


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

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