Mã của bạn trong SSMS không giống với mã bạn chạy trong ứng dụng của mình. Dòng này trong ứng dụng của bạn thêm một tham số NVARCHAR:
ada.SelectCommand.Parameters.AddWithValue("@clientID", ClientID);
trong khi trong tập lệnh SSMS, bạn khai báo nó là VARCHAR:
declare @clientID varchar(200)
Do các quy tắc của Loại dữ liệu được ưu tiên, Where client_id = @clientID
biểu thức trong truy vấn của bạn không có khả năng SARG khi @clientID
thuộc loại NVARCHAR (Tôi đang thực hiện một bước nhảy vọt về niềm tin và cho rằng client_id
cột có kiểu VARCHAR). Do đó, ứng dụng buộc phải quét bảng trong đó truy vấn SSMS có thể thực hiện tìm kiếm khóa nhanh. Đây là một vấn đề ai cũng biết và hiểu về việc sử dụng Parameters.AddWithValue và đã được thảo luận trong nhiều bài báo trước đây, ví dụ:xem Mã truy cập dữ liệu ảnh hưởng đến hiệu suất cơ sở dữ liệu như thế nào. Một khi vấn đề được hiểu, các giải pháp là không quan trọng:
-
thêm tham số với hàm tạo chấp nhận kiểu:
Parameters.Add("@clientID", SqlDbType.Varchar, 200)
(và làm truyền độ dài rõ ràng để ngăn chặn ô nhiễm bộ nhớ cache, xem Hiệu suất truy vấn và lập kế hoạch cho các vấn đề về bộ nhớ cache khi độ dài tham số không được chỉ định chính xác -
hoặc ép kiểu tham số trong văn bản SQL:
where client_id = cast(@clientID as varchar(200))
.
Giải pháp đầu tiên ưu việt hơn vì nó giải quyết được vấn đề ô nhiễm bộ nhớ cache ngoài vấn đề khả năng SARG.
Tôi cũng muốn giới thiệu bạn đọc Chậm trong ứng dụng, Nhanh trong SSMS? Tìm hiểu Bí ẩn về Hiệu suất