เมื่อไม่มีหน่วยความจำกายภาพเหลืออยู่สำหรับข้อมูล SQL Server จะย้ายข้อมูลที่มีอยู่แล้วลงใน TEMPDB
บทความที่คุณเชื่อมโยงกับทำให้เข้าใจผิดอย่างดีที่สุดและไม่ถูกต้องในบางสถานที่ ฉันคิดว่าผู้เขียนพยายามที่จะทำให้สิ่งที่ซับซ้อนบางอย่างซับซ้อนมากเกินไปและในการทำเช่นนั้นไปไกลเกินไปเล็กน้อย
SQL Server จะไม่ย้ายข้อมูลจากหน่วยความจำ (พูลบัฟเฟอร์) ไปที่ tempdb ในวิธีนั้น จะใช้กลยุทธ์การแคช "อย่างน้อยที่สุดเมื่อเร็ว ๆ นี้" (โดยทั่วไป) ดังนั้นหากมีแรงกดดันหน่วยความจำและข้อมูลใหม่จะต้องถูกดึงเข้าไปในหน่วยความจำ SQL Server จะเริ่มต้นข้อมูล LRU จากบัฟเฟอร์พูลเพื่อรองรับข้อมูลใหม่ พฤติกรรมนี้มักถูกตรวจสอบโดยตัวนับ perfmon ที่เรียกว่า"Page Life Expectancy" (PLE) :
คำจำกัดความของ PLE คือเวลาที่คาดหวังเป็นวินาทีที่หน้าไฟล์ข้อมูลที่อ่านเข้าไปในบัฟเฟอร์พูล (แคชในหน่วยความจำของหน้าไฟล์ข้อมูล) จะยังคงอยู่ในหน่วยความจำก่อนที่จะถูกผลักออกจากหน่วยความจำเพื่อให้มีข้อมูลที่แตกต่างกัน หน้าไฟล์ อีกวิธีในการคิดถึง PLE คือการวัดความดันในบัฟเฟอร์พูลทันทีเพื่อสร้างพื้นที่ว่างสำหรับเพจที่กำลังอ่านจากดิสก์ สำหรับคำจำกัดความทั้งสองนี้จำนวนที่สูงขึ้นจะดีกว่า
ในระหว่างการดำเนินการแบบสอบถาม SQL Server สามารถใช้ tempdb สำหรับการดำเนินการบางอย่าง ซึ่งมักจะทำหากการประมาณการไม่ดี แต่หน่วยความจำที่มีอยู่ในระดับต่ำอาจมีผลต่อพฤติกรรมนี้
การดำเนินการบางอย่างที่สามารถ "หก" ไปยัง tempdb ด้วยวิธีนี้คือการแฮชแถว (สำหรับการรวมหรือการรวม ฯลฯ ) การเรียงลำดับแถวในหน่วยความจำและบัฟเฟอร์แถวระหว่างการดำเนินการแบบสอบถามแบบขนาน
แบบสอบถามผู้ใช้ยังสามารถใช้ tempdb อย่างชัดเจน (ด้วยตารางชั่วคราวทั่วโลกหรือท้องถิ่น) และใช้ tempdb (ด้วยสแนปชอตหรืออ่านระดับการแยกสแน็ปช็อตที่กำหนด)
สถานการณ์เหล่านี้ดูเหมือนจะไม่สอดคล้องกับข้อความที่คุณยกมา
เมื่อเหลือหน่วยความจำกายภาพไม่เพียงพอระบบปฏิบัติการสามารถใช้ PAGE FILE และย้ายข้อมูลจากหน่วยความจำกายภาพไป
สิ่งนี้สามารถเกิดขึ้นได้อย่างแน่นอนและอยู่นอกเหนือการควบคุมของ SQL Server เป็นส่วนใหญ่ มีปุ่มที่คุณสามารถเปิดเพื่อพยายามป้องกันการเพจจิ้งระดับ OS บางประเภท ได้แก่ การเปิด"ล็อคหน้าในหน่วยความจำ" (LPIM) :
นโยบาย Windows นี้กำหนดบัญชีที่สามารถใช้กระบวนการในการเก็บข้อมูลในหน่วยความจำกายภาพป้องกันระบบจากการสลับหน้าข้อมูลไปยังหน่วยความจำเสมือนบนดิสก์
ดังนั้นสิ่งที่เราสามารถป้องกันไม่ให้เพจเป็นดิสก์
ก่อนหน้า SQL Server 2012 หน้าที่ได้รับการจัดสรรผ่านส่วนประกอบที่เรียกว่า "Single Page Allocator" ถูกล็อคในหน่วยความจำ (ไม่สามารถทำเพจได้) ซึ่งรวมถึงบัฟเฟอร์พูล (หน้าฐานข้อมูล), โพรซีเดอร์แคชและพื้นที่อื่น ๆ ของหน่วยความจำ
ดูรายละเอียดสนุกกับหน้าล็อค, AWE, ตัวจัดการงานและชุดการทำงาน ...โดยเฉพาะในส่วน "4. ตอนนี้ฉันรู้แล้วว่า SQL Server บน x64 สามารถใช้“ หน้าล็อค” สิ่งที่ถูกล็อคอย่างแน่นอน? การอ่านที่เกี่ยวข้องเพิ่มเติมสามารถพบได้ที่นี่: ยิ่งใหญ่ของเซิร์ฟเวอร์ SQL อภิปราย: ล็อคหน้าในหน่วยความจำ
ใน SQL Server 2012 และใหม่กว่าไม่มี "ตัวจัดสรรหน้าเดียว" (ตัวจัดสรรเดี่ยวและหน้าหลายหน้าถูกรวมเข้าด้วยกันต่อการมองในเชิงลึกของหน่วยความจำ - SQL Server 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'
จากบทความสนับสนุน MS เดียวกันคุณสามารถใช้DBCC MEMORYSTATUS
เพื่อดูว่า "ล็อก" หน่วยความจำมากแค่ไหน
จากบันทึกด้านข้างคุณสามารถเห็นหลักฐานของชุดการทำงานของ SQL Server ที่กำลังทำเพจโดยระบบปฏิบัติการในบันทึกข้อผิดพลาด จะมีข้อความที่มีลักษณะเช่นนี้:
2019-09-02 10: 19: 27.29 spid11s ส่วนสำคัญของหน่วยความจำกระบวนการเซิร์ฟเวอร์ sql ได้รับการเพจออก สิ่งนี้อาจส่งผลให้ประสิทธิภาพลดลง ระยะเวลา: 329 วินาที Working set (KB): 68780, commit (KB): 244052, การใช้งานหน่วยความจำ: 28%