สิ่งแวดล้อม:
เรามีเครื่อง Windows Server 2003 R2 32 บิตสองเครื่องที่รัน SQL Server 2005 การกำหนดค่าฮาร์ดแวร์เป็นเซิร์ฟเวอร์ที่เหมือนกันกับ Xeon 5160 CPU, 4GB RAM และ 13GB RAID0 ไม่ได้เปิดใช้งานการตั้งค่าสถานะ AWE และ / 3GB
เซิร์ฟเวอร์ถูกตั้งค่าแบบเคียงข้างกันโดยใช้รายการตรวจสอบการติดตั้งที่กำหนดไว้ล่วงหน้าและซอฟต์แวร์ที่ติดตั้งทั้งหมดนั้นเหมือนกันในทั้งสองเครื่อง
ทุกการตั้งค่าการติดตั้งเซิร์ฟเวอร์ SQL และระดับแพตช์ที่เรารู้ว่าจะเหมือนกัน สิ่งหนึ่งที่แตกต่างคือ TEMPDB คือ 400MB บนเครื่องที่เร็วและ 1.2GB สำหรับเครื่องที่ช้า อย่างไรก็ตามในทั้งสองกรณีเราไม่เห็นการจัดสรร TEMPDB ใด ๆ
ปัญหา:
มีขั้นตอนการจัดเก็บซึ่งทำงานใน 2 วินาทีในหนึ่ง แต่อีก 15 นาที ในช่วง 15 นาทีที่ผ่านมาไม่มีกิจกรรมของดิสก์เพียงเล็กน้อยไม่มีการเปลี่ยนแปลงการใช้หน่วยความจำ แต่มี CPU core หนึ่งอันที่ 100% ตลอดเวลา
ลักษณะการทำงานนี้จะยังคงอยู่แม้ว่าจะมีการสำรองฐานข้อมูลจากที่หนึ่งและเรียกคืนไปยังอีก
เนื่องจากเป็นกระบวนงานที่เก็บไว้ตัวตรวจสอบกิจกรรมและตัวสร้างโปรไฟล์จะไม่แสดงรายละเอียดใด ๆ เกี่ยวกับตำแหน่งที่อยู่ในกระบวนงานที่เก็บไว้กิจกรรม CPU สูงนี้กำลังเกิดขึ้น
คำถาม:
เราควรมองอะไรอีก
ติดตาม:
ความเชื่องช้าเกิดขึ้นในคำสั่ง FETCH NEXT สำหรับการกำหนดเคอร์เซอร์ดังต่อไปนี้:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
...
<snip>
...
FETCH NEXT FROM C INTO @X, @Y
FETCH NEXT FROM C INTO @X, @Y
...
แต่ละคำสั่ง FETCH - บนตารางที่มีเพียง 1,000 แถวเท่านั้นต้องใช้เวลาประมาณ 7.25 นาที (ไม่ฉันไม่รู้ว่าทำไมจึงมีสองอย่างติดต่อกันต้องถามผู้พัฒนา แต่มันทำงานได้อย่างถูกต้องบนเซิร์ฟเวอร์ทั้งสอง)
ฉันสงสัยเล็กน้อยว่า "ไม่ได้อยู่ใน (เลือก ... )" เนื่องจากดูเหมือนว่า Virtual Reads นั้นสูงมาก