Tôi đang cố gắng hiểu vấn đề chúng tôi gặp phải với SQL Server 2000. Chúng tôi là một trang web giao dịch vừa phải và chúng tôi có một kho lưu trữ được gọi là sp_GetCurrentTransactions
chấp nhận ID khách hàng và hai ngày.
Bây giờ tùy thuộc vào ngày và khách hàng, truy vấn này có thể trả về mọi thứ từ 0 đến 1000 hàng.
Vấn đề: những gì chúng tôi đã trải qua là đột nhiên chúng tôi sẽ nhận được một số lỗi (thường Execution Timeout Expired
hoặc tương tự) cho một khách hàng cụ thể trong khi họ thử thực thi lệnh lưu trữ đó. Vì vậy, chúng tôi kiểm tra truy vấn, chạy nó trong SSMS và thấy rằng phải mất 30 giây. Vì vậy, chúng tôi biên dịch lại các Proc được lưu trữ và -bang- nó chạy trong 300ms.
Tôi đã nói chuyện với DBA của chúng tôi về điều này. Anh ấy đã nói với tôi rằng cơ sở dữ liệu đã tạo ra một kế hoạch truy vấn khi chúng tôi tạo ra các lưu trữ được lưu trữ. Ông nói rằng đó là một kế hoạch tốt cho bộ tham số đó, nhưng nếu bạn ném một bộ thông số nhất định vào nó, thì kế hoạch đó sẽ không phải là kế hoạch tốt nhất cho dữ liệu đó, và vì vậy bạn sẽ thấy nó chạy chậm.
Các tùy chọn được trình bày cho tôi là việc di chuyển vấn đề truy vấn từ một Proc được lưu trữ và quay lại SQL động có kế hoạch thực hiện được tạo trong mỗi lần chạy.
Cảm giác này giống như một bước lùi lại với tôi và tôi cảm thấy như phải có một cách xung quanh điều này. Có cách nào khác để giải quyết vấn đề này không?
Bất kỳ và tất cả các câu trả lời được đánh giá cao.