Tôi đang phát triển một hệ thống định kỳ (4-5 lần mỗi ngày) chạy một câu lệnh chọn, thường mất ít hơn 10 giây nhưng định kỳ mất tới 40 phút.Truy vấn chậm liên tục trên SQL Server 2008
Cơ sở dữ liệu nằm trên Windows Server 2008 + SQL Server 2008 R2; cả 64bit.
Có một dịch vụ trên máy chạy cơ sở dữ liệu thăm dò ý kiến cơ sở dữ liệu và tạo ra giá trị cho các bản ghi yêu cầu. Những hồ sơ này sau đó được truy vấn định kỳ bằng cách sử dụng một bảng đa tham gia chọn từ một dịch vụ trên một máy thứ hai được viết bằng C++ (VS 2010) bằng cách sử dụng lớp MFC CRecordset để trích xuất dữ liệu. Ví dụ về truy vấn gây ra sự cố được hiển thị bên dưới.
SELECT DISTINCT "JobKeysFrom"."Key" AS "KeyFrom","KeysFrom"."ID" AS "IDFrom",
"KeysFrom"."X" AS "XFrom","KeysFrom"."Y" AS "YFrom","JobKeysTo"."Key" AS "KeyTo",
"KeysTo"."ID" AS "IDTo","KeysTo"."X" AS "XTo","KeysTo"."Y" AS "YTo",
"Matrix"."TimeInSeconds","Matrix"."DistanceInMetres","Matrix"."Calculated"
FROM "JobKeys" AS "JobKeysFrom"
INNER JOIN "JobKeys" AS "JobKeysTo" ON
("JobKeysFrom"."Key"<>"JobKeysTo"."Key") AND
("JobKeysFrom"."JobID"=531) AND
("JobKeysTo"."JobID"=531)
INNER JOIN "Keys" AS "KeysFrom" ON
("JobKeysFrom"."Key"="KeysFrom"."Key") AND ("JobKeysFrom"."Status"=4)
INNER JOIN "Keys" AS "KeysTo" ON
("JobKeysTo"."Key"="KeysTo"."Key") AND ("JobKeysTo"."Status"=4)
INNER JOIN "Matrix" AS "Matrix" ON
("Matrix"."IDFrom"="KeysFrom"."ID") AND ("Matrix"."IDTo"="KeysTo"."ID")
ORDER BY "JobKeysFrom"."Key","JobKeysTo"."Key"
Tôi đã thử những điều sau
- kiểm tra các chỉ mục và tất cả dường như đúng và họ đang hoạt động và đang được sử dụng theo quy định của truy vấn
- cố vấn thiết kế trở lại với không gợi ý
- Tôi đã cố gắng chống phân mảnh các chỉ mục và dữ liệu
- xây dựng lại cơ sở dữ liệu từ đầu bằng cách xuất dữ liệu và nhập lại dữ liệu trong cơ sở dữ liệu mới.
- chạy hồ sơ trên đó và thấy rằng khi nó đi sai có vẻ như để làm nhiều triệu (lên đến 100 triệu) của lần đọc chứ không phải là một vài trăm nghìn.
- chạy cơ sở dữ liệu trên máy chủ khác nhau
Trong thời gian nó đang chạy truy vấn, tôi có thể chạy chính xác cùng một truy vấn trong cửa sổ quản lý phòng thu và nó sẽ trở lại để chạy trong 10 giây. Vấn đề dường như không bị khóa, bế tắc, CPU, đĩa hoặc bộ nhớ liên quan vì nó đã thực hiện nó khi máy chạy cơ sở dữ liệu chỉ chạy một truy vấn này. Máy chủ có 4 bộ vi xử lý và 16 gb bộ nhớ để chạy nó. Tôi cũng đã thử nâng cấp các đĩa lên nhanh hơn nhiều và điều này không có hiệu lực. Có vẻ như với tôi rằng nó gần như là cơ sở dữ liệu nhận được truy vấn, bắt đầu xử lý nó và sau đó đi ngủ trong 40 phút hoặc chạy truy vấn mà không sử dụng các chỉ mục.
Khi phải mất một thời gian dài nó cuối cùng sẽ kết thúc và gửi kết quả truy vấn (thông thường khoảng 70-100000 bản ghi) trở lại ứng dụng gọi điện.
Bất kỳ trợ giúp hoặc đề xuất nào sẽ được nhận biết ơn, nhiều người cảm ơn
Truy vấn này có chạy như một thủ tục được lưu trữ tham số không? –
Bạn có thể tránh DISTINCT CHỌN không? Điều này có thể làm tổn thương hiệu suất nặng nề. –
@Yves: có vẻ như nó đủ hiệu quả để chạy adhoc và trả về sau 10 giây. –