การเขียนไปที่ TempDB มักจะส่งผลให้เกิดการเขียนทางกายภาพจริงไปยังดิสก์เสมอหรือเป็น TempDB ที่เขียนโดย SQL Server สำหรับการเขียนที่ล่าช้าเช่นในแคชของระบบไฟล์ Windows
พวกเขาทำเสมอหรือไม่ ไม่แน่นอนที่สุด พวกเขาเคย? ใช่ แต่ไม่ใช่เป็นผลมาจากกลไกทั่วไป การอ้างอิงที่นี่จุดตรวจสอบทำอะไรกับ tempdb .
ในระบบ "ดีประพฤติ" เขียนไปยังไฟล์ฐานข้อมูลผู้ใช้ที่เกิดขึ้นในด่าน ในระบบที่ประพฤติตัวไม่ดีการเขียนจะเกิดขึ้นเมื่อ lazywriter จำเป็นต้องล้างข้อมูลหน้าจากพูลบัฟเฟอร์เพื่อให้มีที่ว่างสำหรับหน้าอื่น ๆ
จุดตรวจจะทำสำหรับ tempdb เมื่อไฟล์บันทึก tempdb เต็ม 70% เท่านั้น - เพื่อป้องกันไม่ให้ไฟล์บันทึก tempdb เพิ่มขึ้นหากเป็นไปได้ (โปรดทราบว่าธุรกรรมที่ใช้เวลานานยังคงสามารถจับตัวประกันล็อกไว้ได้และป้องกันไม่ให้เคลียร์ข้อมูล เช่นเดียวกับในฐานข้อมูลผู้ใช้)
แต่ไม่จำเป็นต้องล้างข้อมูล tempdb ลงในดิสก์เนื่องจากการกู้คืนความผิดพลาดจะไม่ทำงานบน tempdb จึงสร้างขึ้นใหม่เมื่อเริ่มต้น
Tempdb จะไม่ถูกกู้คืนในกรณีที่เกิดข้อขัดข้องดังนั้นจึงไม่จำเป็นต้องบังคับให้เพจ tempdb สกปรกไปยังดิสก์ยกเว้นในกรณีที่กระบวนการ lazywriter (ส่วนหนึ่งของพูลบัฟเฟอร์) ต้องสร้างพื้นที่สำหรับเพจจากฐานข้อมูลอื่น
สิ่งนี้น่าประหลาดใจ (สำหรับฉัน) เป็นกลไกเดียวที่เพจ tempdb จะถูกเขียนไปยังดิสก์ หากมีแรงกดดันบัฟเฟอร์พูลหน้า tempdb อาจถูกล้างข้อมูลลงในดิสก์ หากไม่มีก็ไม่ควรเกิดขึ้น
แก้ไข: เป็นที่น่าสงสัยว่า "ประพฤติไม่ดี" เป็นคำอธิบายที่เหมาะสมสำหรับฐานข้อมูลผู้ใช้ที่กำลังเขียนหน้านอกด่าน ผิดปกติผิดปรกติหรืออาจไม่เหมาะ
แก้ไขเพิ่มเติม (ตามความเห็น / แชทกับ @PaulWhite):
การละเลยการจ้องมองด้านบนคือตารางชั่วคราวไม่ใช่แหล่งของการรับส่งข้อมูลชั่วคราว การอ้างถึงจากการทำความเข้าใจกับแฮชเรียงลำดับและแลกเปลี่ยนเหตุการณ์ที่หก :
การดำเนินการประมวลผลแบบสอบถาม SQL Server บางอย่างถูกปรับเทียบเพื่อให้ทำงานได้ดีที่สุดโดยใช้หน่วยความจำขนาดใหญ่ (ค่อนข้าง) เป็นที่เก็บข้อมูลระดับกลาง เครื่องมือเพิ่มประสิทธิภาพ Query จะเลือกแผนและประมาณการค่าใช้จ่ายตามผู้ให้บริการเหล่านี้โดยใช้แผ่นบันทึกหน่วยความจำนี้ แต่นี่เป็นเพียงการประมาณการเท่านั้น เมื่อดำเนินการประมาณการณ์อาจพิสูจน์ว่าผิดและแผนต้องดำเนินการต่อไปแม้จะมีหน่วยความจำไม่เพียงพอ ในเหตุการณ์ดังกล่าวผู้ประกอบการเหล่านี้จะรั่วไหลไปยังดิสก์
ฉันสันนิษฐานว่ากลไกที่อยู่เบื้องหลังการเขียนทางกายภาพสำหรับการดำเนินการที่รั่วไหลนั้นเหมือนกับที่อธิบายไว้ก่อนหน้านี้คือ lazywriter บังคับให้เพจ tempdb ไปที่ดิสก์อันเป็นผลมาจากแรงกดดันต่อพูลบัฟเฟอร์ (เกิดจากการรั่วไหล)
@ PaulWhite อธิบายว่าฉันผิดตรงไหน (ขอบคุณ Paul!):
ฉันคิดว่าคุณกำลังถามว่าเหตุใดกิจกรรมทางกายภาพ tempdb จึงเกิดขึ้นเมื่อแบบสอบถามเกินกว่าหน่วยความจำที่ให้พื้นที่ทำงานแทนที่จะใช้ tempdb ในหน่วยความจำหากทำเช่นนั้นแบบสอบถามจะใช้หน่วยความจำมากกว่าสิทธิ์ให้เอาชนะจุดจำหน่วยความจำ ถือเป็นครั้งแรก
การรั่วไหลเป็นพิเศษในการเขียนผ่านการจัดเก็บ กิจกรรมทางกายภาพ tempdb จะเห็นได้ในการรั่วไหลแม้ในหน้าของหน่วยความจำฟรีและความดันเป็นศูนย์ใน tempdb
พอลยังชี้นำฉันไปยังโพสต์บล็อกของเขาการปรับแต่ง TSQL ขั้นสูง: ทำไมเรื่องความรู้ภายในซึ่งมีตัวอย่างสคริปต์สำหรับการสาธิตการรั่วไหลสำหรับผู้ที่ต้องการเจาะลึก