เหตุใดข้อความค้นหาทำให้เกิดการรั่วไหลของ tempdb


27

พื้นหลัง

ฉันอยู่ในขั้นตอนการย้ายฐานข้อมูล 160GB จาก MSSQL 2008 (มาตรฐาน) บนเซิร์ฟเวอร์ Win 2008 ที่มี 48gb RAM ไปยังเซิร์ฟเวอร์ใหม่ที่ใช้ MSSQL 2012 (รุ่นเว็บ 64 บิต) ใน Win 2012 ด้วย 64GB ของ RAM เซิร์ฟเวอร์เก่าใช้งานได้และอยู่ระหว่างการโหลด เซิร์ฟเวอร์ใหม่ไม่ได้ใช้งานจริง เซิร์ฟเวอร์ใหม่มีไฟล์ 8 tempdb (แต่ละไฟล์ 4GB)

ปัญหา

ในการทดสอบบนเซิร์ฟเวอร์ใหม่ฉันเห็นขั้นตอนในการสอบถามจำนวนมากทำให้เกิดการแจ้งเตือนถึง "ผู้ดำเนินการใช้ tempdb เพื่อทำข้อมูลหกระหว่างการดำเนินการ" ฉันสามารถหลีกเลี่ยงการเรียงลำดับได้โดยเขียนคำค้นหาบางคำใหม่ แต่นี่ไม่ได้เป็นการแก้ปัญหาจริงๆ แบบสอบถามเดียวกันบนเซิร์ฟเวอร์เก่าไม่ทำให้เกิดการรั่วไหล ฉันได้อ่านว่าการรั่วไหลเกิดขึ้นเมื่อ MSSQL ไม่สามารถดำเนินการในหน่วยความจำจนเสร็จและต้องมีการหก / หน้าลงใน tempdb ฉันควรจะกังวลเกี่ยวกับการหกหรือไม่

ตัวอย่าง

ป้อนคำอธิบายรูปภาพที่นี่

ฉันรัน sp_updatestats ในฐานข้อมูลดังนั้นสถิติควรเป็นข้อมูลล่าสุด แต่คุณจะสังเกตเห็นว่ามีความคลาดเคลื่อนระหว่างจำนวนแถวโดยประมาณกับจำนวนแถวจริง

ความกังวลของหน่วยความจำ

ฉันได้ตั้งค่าหน่วยความจำสูงสุดสำหรับ MSSQL 58 จาก 64gb ปัจจุบัน MSSQL ใช้หน่วยความจำนี้ประมาณ 35GB แต่มีชุดการทำงานเพียง 682mb เซิร์ฟเวอร์เก่า (แม้ว่าจะอยู่ระหว่างการผลิต, การจัดการโหลด) มีหน่วยความจำ 44gb ที่มุ่งมั่นกับ MSSQL ซึ่ง 43.5gb อยู่ในชุดการทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่ทราบว่าการรั่วไหลอาจเกี่ยวข้องกับการตั้งค่าหน่วยความจำ - ทุกคนมีแนวคิดหรือไม่? MSSQL ในปัจจุบันมี RAM เหลืออยู่เป็นจำนวนมากดังนั้นเหตุใดจึงมีการรั่วไหลลงใน tempdb สำหรับการแข่งขันและแฮชบางประเภท


7
การแจ้งเตือนในแผนการดำเนินการเป็นเรื่องใหม่ในปี 2555 คุณตรวจสอบแล้วว่ายังไม่กระจายไปทั่วบนเซิร์ฟเวอร์เก่าใช่ไหม คุณตรวจสอบเรื่องนี้หรือไม่?
Martin Smith

@MartinSmith อาไม่ทราบว่าการแจ้งเตือนเป็นเรื่องใหม่ ฉันไม่ได้ตรวจสอบการรั่วไหลบนเซิร์ฟเวอร์เก่า จะตรวจสอบว่า

1
จุดสัมผัสเล็กน้อย แต่ฉันนั่งอยู่หน้าตาราง 10 การเข้าร่วมที่โดยค่าเริ่มต้นส่วนใหญ่ใช้การรวมการรวมกับการประมาณแถวที่ดีมากซึ่งทำให้ tempdb ระดับ 0 การรั่วไหลและรันไทม์ 25s การบังคับให้แฮชรวม (และคำสั่งซื้อ) ลบการรั่วไหลและดำเนินการใน 9 วินาที ฉันเหลือสงสัยว่ามันผสานกับแฮชหรือการรั่วไหลที่ก่อให้เกิดความแตกต่างและว่าเครื่องมือเพิ่มประสิทธิภาพอย่างถูกต้องถ่วงน้ำหนักผลกระทบของการรั่วไหลที่จะเกิดขึ้นดูเหมือนว่าที่รู้จักกัน (เพราะประมาณการแถวดีมาก)
crokusek

เซิร์ฟเวอร์ใหม่มีฮาร์ดแวร์ numa หรือไม่
stacylaray

คำตอบ:


28

มีคำถามที่แตกต่างกันในที่นี่:

ถาม: ทำไมคำค้นหาไม่รั่วไหลมาก่อน

พวกเขาเป็น แต่ Studio จัดการเซิร์ฟเวอร์ SQL ไม่ได้แสดงให้เห็นว่านี่เป็นข้อผิดพลาดที่ชัดเจนก่อน SQL 2012 มันเป็นตัวอย่างที่ดีว่าทำไมเมื่อคุณทำการปรับแต่งประสิทธิภาพคุณจะต้องเจาะลึกกว่าแผนปฏิบัติการกราฟิก

ถาม: ทำไมเคียวรีที่หกรั่วไหลไปยังดิสก์

เนื่องจาก SQL Server ไม่ได้ให้หน่วยความจำเพียงพอต่อการดำเนินการ บางทีแผนการดำเนินการประเมินจำนวนหน่วยความจำที่ต้องการต่ำกว่าหรืออาจเป็นกล่องที่อยู่ภายใต้แรงกดดันของหน่วยความจำ (โปรดจำไว้ว่า SQL Server ใช้หน่วยความจำสำหรับสามสิ่ง - แคชหน้าข้อมูลดิบแผนการดำเนินการแคชและพื้นที่ทำงานสำหรับคิวรีหน่วยความจำพื้นที่ทำงานนั้นจบลงด้วยขนาดที่ค่อนข้างเล็ก)

ถาม: ฉันจะลดการรั่วไหลได้อย่างไร

โดยการเขียนคำสั่ง T-SQL ที่สามารถทำได้ซึ่งมีสถิติที่ทันสมัยทำให้มีหน่วยความจำเพียงพอในเซิร์ฟเวอร์สร้างดัชนีที่ถูกต้องและตีความแผนการดำเนินการเมื่อสิ่งต่าง ๆ ไม่เป็นไปตามที่คุณคาดหวัง ตรวจสอบหนังสือ SQL Server Query Performance Tuning Book ของ Grant Fritcheyสำหรับคำอธิบายโดยละเอียดของสิ่งเหล่านั้นทั้งหมด

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