Môi trường:
Chúng tôi có hai máy Windows Server 2003 R2 32 bit chạy SQL Server 2005. Cấu hình phần cứng là các máy chủ giống hệt nhau với CPU Xeon 5160, RAM 4GB và RAID0 13GB. Cờ AWE và / 3GB không được bật.
Các máy chủ được thiết lập cạnh nhau bằng cách sử dụng danh sách kiểm tra cài đặt được xác định trước và TẤT CẢ phần mềm được cài đặt giống nhau trên cả hai máy.
Mỗi cài đặt cài đặt máy chủ SQL và mức vá lỗi mà chúng tôi biết để kiểm tra là giống hệt nhau. Một điểm khác biệt là TEMPDB là 400 MB trên máy nhanh và 1,2 GB trên máy chậm. Tuy nhiên, trong cả hai trường hợp, chúng tôi không thấy bất kỳ phân bổ TEMPDB nào đang diễn ra.
Vấn đề:
Có một thủ tục được lưu trữ chạy trong 2 giây trên một, nhưng 15 phút khác. Trong 15 phút bổ sung, có rất ít hoặc không có hoạt động của đĩa, không có thay đổi sử dụng bộ nhớ, nhưng một lõi CPU được ghim 100% toàn bộ thời gian.
Hành vi này vẫn tồn tại ngay cả khi cơ sở dữ liệu được sao lưu từ cái này và được khôi phục lại cái kia.
Vì nó là một thủ tục được lưu trữ, trình giám sát hoạt động và trình lược tả không hiển thị cho chúng tôi bất kỳ chi tiết nào về nơi trong quy trình được lưu trữ, hoạt động CPU cao này đang diễn ra.
Câu hỏi:
Những gì khác chúng ta nên xem xét?
Theo sát:
Sự chậm chạp xảy ra trong các câu lệnh FETCH NEXT cho định nghĩa con trỏ sau:
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
...
Mỗi câu lệnh FETCH - trên một bảng chỉ chứa khoảng 1000 hàng - yêu cầu khoảng 7,25 phút. (Không, tôi không biết tại sao nó làm hai liên tiếp, cần phải hỏi các nhà phát triển, nhưng nó chạy đúng trên cả hai máy chủ).
Tôi hơi nghi ngờ về điều đó "KHÔNG VÀO (CHỌN ...)", vì có vẻ như Số lần đọc ảo thực sự rất cao.