วิธีแก้ไข RESOURCE_SEMAPHORE และ RESOURCE_SEMAPHORE_QUERY_COMPILE ประเภทการรอ


13

เรากำลังพยายามหาสาเหตุของการทำงานของ sql server ที่ทำงานช้าการสืบค้น / การดึงข้อมูลจากหนึ่งในฐานข้อมูลขนาด 300 GB โฮสต์บนเซิร์ฟเวอร์ด้วยการกำหนดค่าด้านล่าง:

เซิร์ฟเวอร์ Windows 2003 R2, SP2, Enterprise Edition, RAM 16 GB, 12 CPU'S 32 บิต

SQL Server 2005, SP4, Enterprise Edition, 32 บิต

เราได้แจ้งธุรกิจเกี่ยวกับการอัปเกรดเป็น 64 บิตซึ่งจะใช้เวลามากกว่าหนึ่งเดือน

แต่สำหรับปัญหาปัจจุบันเราพยายามรวบรวมข้อมูลถ้าเราสามารถแก้ไขความกดดันของหน่วยความจำหรือในที่สุดก็มาถึงข้อสรุปเพื่อเพิ่มแรม

การดำเนินการเสร็จสิ้น: การจัดทำดัชนีและอัพเดตสถานะใหม่นั้นเหมาะสมสำหรับฐานข้อมูล

ดังที่แสดงไว้ด้านล่างเราได้สังเกตสัญญาณเซมาฟอร์เป็นเวลา 5 วันที่ผ่านมาวิ่งในช่วงเวลาโหลด:

waittype

ข้อมูลน้อยหลังจากแบบสอบถามด้านล่าง: ขนาดของบัฟเฟอร์ = 137272

SELECT SUM(virtual_memory_committed_kb)
FROM sys.dm_os_memory_clerks
WHERE type='MEMORYCLERK_SQLBUFFERPOOL'

และหน่วยความจำสัญญาณ = 644024 ต่อแบบสอบถามด้านล่าง

 SELECT SUM(total_memory_kb)
FROM sys.dm_exec_query_resource_semaphores

ด้านล่างนี้เป็นข้อมูลเพิ่มเติมที่รวบรวมได้จากdm_exec_query_resource_semaphoresและsys.dm_exec_query_memory_grantsDMV ของ

dmvserror

ดังนั้นจากข้อมูลข้างต้นที่รวบรวมและต่อสัญญาณข้อมูลของ SP_Blitz แหล่งสัญญาณดูเหมือนว่าจะเป็นปัญหา

หน่วยความจำ 'target_memory_kb' ถูกกำหนดให้กับเซมาฟอร์ id ของทรัพยากรต่ำเกินไปเมื่อเปรียบเทียบกับ RAM ขนาด 16 GB ที่มีอยู่

หมายเหตุ * ต่อการวิเคราะห์ใน 8 ชั่วโมงการทำงาน 'target_memory_kb' มักจะน้อยกว่า 1 GB เทียบกับ 16 GB ที่มีอยู่หรือไม่

สิ่งที่อาจเป็นปัญหาที่นี่และวิธีแก้ไขโปรดแนะนำ

ขอบคุณ


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท ความคิดเห็นนอกหัวข้อเพิ่มเติมจะถูกลบออก
พอลไวท์ 9

คำตอบ:


25

โอ้พระเจ้าฉันมีข่าวดีมาบ้าง

บนระบบปฏิบัติการ 32 บิต SQL Server จะใช้หน่วยความจำ 4GB ตัวแรกเท่านั้นสำหรับสิ่งต่าง ๆ เช่นพื้นที่ใช้งานแบบสอบถาม (และมันกำลังต่อสู้กับระบบปฏิบัติการสำหรับ 4GB นั้นด้วยเช่นกันแอพอื่น ๆ ที่ทำงานอยู่ก็จะแย่งชิงหน่วยความจำนั้นด้วย)

4GB อาจฟังดูเยอะ แต่มันค่อนข้างง่ายที่จะเขียนเคียวรีที่ต้องการหน่วยความจำหลาย GB เพื่อให้ทำงานได้ เมื่อแบบสอบถามเพียงพอต้องการหน่วยความจำเพียงพอ SQL Server จะปล่อย RESOURCE_SEMAPHORE รอเนื่องจากคิวรีไม่สามารถได้หน่วยความจำเพียงพอเพื่อเริ่มต้น RESOURCE_SEMAPHORE_QUERY_COMPILE หมายความว่าพวกเขาไม่สามารถได้รับหน่วยความจำเพียงพอที่จะรวบรวมแผนการดำเนินการ - และใช่ว่าไม่ดีเลย

ดังนั้นคุณจะแก้ไขได้อย่างไร

  • เปลี่ยนเป็นระบบปฏิบัติการ 64 บิต (ระบบปฏิบัติการที่คุณใช้งานนั้นไม่สนับสนุนนาน)
  • สลับเป็น SQL Server รุ่น 64 บิต
  • ลดความต้องการหน่วยความจำบนเซิร์ฟเวอร์ (ไม่เรียกใช้แอปอื่น ๆ ในกล่องนี้และนี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับกล่อง 32 บิตเนื่องจากเราต่อยอดเพียง 4GB)
  • ใช้หน่วยความจำเพิ่มเติมด้วยสวิตช์ AWE / PAE - ยกเว้นว่าจะไม่ทำงานสำหรับ RESOURCE_SEMAPHORE รอเนื่องจาก SQL Server สามารถใช้ 4GB แรกเท่านั้นสำหรับพื้นที่ทำงานแบบสอบถาม
  • ปรับแต่งคำถาม & ดัชนีเพื่อให้พวกเขาต้องการหน่วยความจำน้อยลง

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

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