जब डेटा के लिए कोई भौतिक मेमोरी नहीं बचती है, तो SQL सर्वर TEMPDB में पहले से मौजूद डेटा को स्थानांतरित करता है
आपके द्वारा जोड़ा गया लेख कुछ स्थानों पर सबसे अच्छा और गलत है। मुझे लगता है कि लेखक कुछ जटिल चीजों को अधिक सरल बनाने का प्रयास कर रहा था, और ऐसा करने में बहुत दूर चला गया।
SQL सर्वर उस तरह से tempdb में मेमोरी (बफर पूल) से डेटा को स्थानांतरित नहीं करता है। यह "कम से कम हाल ही में उपयोग की गई" कैशिंग रणनीति (सामान्य रूप से) का उपयोग करता है, इसलिए यदि मेमोरी दबाव है, और नए डेटा को मेमोरी में खींचने की आवश्यकता है, तो SQL सर्वर नए डेटा को समायोजित करने के लिए बफर पूल से LRU डेटा को बाहर निकाल देगा। इस व्यवहार की निगरानी अक्सर "पृष्ठ जीवन प्रत्याशा" (PLE) नामक परफ़ॉर्म काउंटर द्वारा की जाती है :
PLE की परिभाषा अपेक्षित समय है, सेकंड में, कि एक डेटा फ़ाइल पेज बफर पूल (डेटा फ़ाइलों के इन-मेमोरी कैश) में पढ़ा जाता है, एक अलग डेटा के लिए जगह बनाने के लिए मेमोरी से बाहर धकेल दिए जाने से पहले मेमोरी में रहेगा। फ़ाइल पृष्ठ। PLE के बारे में सोचने का एक अन्य तरीका बफर पूल पर दबाव का एक तात्कालिक उपाय है, जो डिस्क से पढ़े जा रहे पन्नों के लिए मुफ्त स्थान बनाता है। इन दोनों परिभाषाओं के लिए, एक उच्च संख्या बेहतर है।
क्वेरी निष्पादन के दौरान, SQL सर्वर कुछ कार्यों के लिए tempdb का उपयोग कर सकता है । यह आमतौर पर किया जाता है यदि अनुमान खराब हैं, लेकिन कम उपलब्ध स्मृति इस व्यवहार को प्रभावित कर सकती है।
कुछ ऑपरेशन जो इस तरह से tempdb को "स्पिल" कर सकते हैं उनमें हैशिंग रो (जोड़ या एग्रीगेट, आदि के लिए), मेमोरी में पंक्तियों को छांटना और समानांतर क्वेरी निष्पादन के दौरान बफ़रिंग पंक्तियाँ हैं।
उपयोगकर्ता प्रश्न भी स्पष्ट रूप से tempdb (वैश्विक या स्थानीय अस्थायी तालिकाओं के साथ) का उपयोग कर सकते हैं, और अस्थायी रूप से tempdb (स्नैपशॉट के साथ या प्रतिबद्ध स्नैपशॉट अलगाव स्तर पढ़ सकते हैं) का उपयोग कर सकते हैं।
इन स्थितियों में से कोई भी वास्तव में आपके द्वारा उद्धृत कथन के लायक नहीं लगता है।
जब पर्याप्त भौतिक मेमोरी नहीं बची है, तो ऑपरेटिंग सिस्टम पेज फाइल का उपयोग कर सकता है और भौतिक मेमोरी से डेटा को स्थानांतरित कर सकता है
यह निश्चित रूप से हो सकता है, और अधिकांश भाग के लिए SQL सर्वर के नियंत्रण से बाहर है। एक नॉब है जिसे आप कुछ प्रकार के OS-लेवल पेजिंग को रोकने की कोशिश कर सकते हैं, जिसका नाम है "Lock Pages in Memory" (LPIM) :
यह विंडोज पॉलिसी यह निर्धारित करती है कि कौन से खाते भौतिक मेमोरी में डेटा रखने के लिए एक प्रक्रिया का उपयोग कर सकते हैं, सिस्टम को डिस्क पर वर्चुअल मेमोरी में डेटा को पेजिंग करने से रोक सकते हैं।
तो हम डिस्क में पेज होने से क्या रोक सकते हैं?
SQL सर्वर 2012 से पहले, "सिंगल पेज एलोकेटर" नामक एक घटक के माध्यम से आवंटित किए गए पृष्ठों को मेमोरी में बंद कर दिया गया था (जिसका मंचन नहीं किया जा सकता था)। इसमें बफर पूल (डेटाबेस पेज), प्रक्रिया कैश और स्मृति के कुछ अन्य क्षेत्र शामिल थे।
लॉक किए गए पृष्ठों के साथ मज़ा देखें , AWE, टास्क मैनेजर, और वर्किंग सेट ... विवरण के लिए, विशेष रूप से अनुभाग "4. अब मुझे पता है कि x64 पर SQL सर्वर" लॉक किए गए पृष्ठ "का उपयोग कर सकता है, वास्तव में क्या लॉक है?" अतिरिक्त संबंधित रीडिंग यहां पाई जा सकती है: ग्रेट SQL सर्वर डिबेट: मेमोरी में लॉक पेज
SQL सर्वर 2012 और बाद में, कोई "सिंगल पेज एलोकेटर" नहीं है (एकल और मल्टी-पेज एलोकेटर्स को मर्ज किया गया था, प्रति मेमोरी में गहराई से देखें - SQL सर्वर 2012/2014 )। क्या, वास्तव में, क्या और क्या नहीं देखा जा सकता है, इसका विवरण विस्तार से कहीं भी नहीं है जो मैंने देखा है। आप एक प्रश्न का उपयोग कर सकते इस तरह देखने के लिए क्या कर रहा है बंद कर दिया:
select osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb
from sys.dm_os_memory_nodes omn
inner join sys.dm_os_nodes osn on (omn.memory_node_id = osn.memory_node_id)
where osn.node_state_desc <> 'ONLINE DAC'
उसी एमएस सपोर्ट लेख के अनुसार, आप यह DBCC MEMORYSTATUS
देखने के लिए भी उपयोग कर सकते हैं कि मेमोरी कितनी "लॉक" है।
एक साइड नोट के रूप में, आप SQL सर्वर के कार्य सेट के सबूत को ओएस द्वारा त्रुटि लॉग में देखे जाने के प्रमाण में देख सकते हैं। इस तरह दिखने वाले संदेश होंगे:
2019-09-02 10: 19: 27.29 spid11s एसक्यूएल सर्वर प्रक्रिया मेमोरी का एक महत्वपूर्ण हिस्सा बाहर पृष्ठांकित किया गया है। इसके परिणामस्वरूप प्रदर्शन में गिरावट आ सकती है। अवधि: 329 सेकंड। कार्य सेट (KB): 68780, प्रतिबद्ध (KB): 244052, मेमोरी उपयोग: 28%।