พฤติกรรมของ SQL Server TempDB ในสภาพแวดล้อมของหน่วยความจำขนาดใหญ่


12

การอ่านคำถามนี้ทำให้ฉันนึกถึงคำถามที่ฉันได้ซักพักหนึ่งแล้ว

เรามี SQL Server ที่มี RAM ขนาด 512GB ฐานข้อมูลหลักคือ 450 GB เราเห็นการกระทำค่อนข้างมากใน TempDB (ตกลงฉันคิดว่ามันเป็น "การกระทำค่อนข้างมาก" - อาจไม่ได้!) ฉันติดตั้งเซิร์ฟเวอร์ตัวอย่างของ RamDisk Plus สร้าง ramdrive 50GB ชี้ไปที่ TempDB แล้วไม่เห็นการปรับปรุงประสิทธิภาพเลย

การเขียนไปที่ TempDB มักจะส่งผลให้เกิดการเขียนทางกายภาพจริงไปยังดิสก์เสมอหรือเป็น TempDB ที่เขียนโดย SQL Server สำหรับการเขียนที่ล่าช้าเช่นในแคชของระบบไฟล์ Windows

ramdisk ไม่มีจุดหมายในสถานการณ์นี้หรือไม่?

ฉันรู้ว่า SQL Server 6.5 ได้รับการสนับสนุนสำหรับ TempDB-In-Ram แต่ฉันเห็นว่าเลิกใช้มานานแล้ว!

คำตอบ:


19

การเขียนไปที่ 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 ขั้นสูง: ทำไมเรื่องความรู้ภายในซึ่งมีตัวอย่างสคริปต์สำหรับการสาธิตการรั่วไหลสำหรับผู้ที่ต้องการเจาะลึก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.