Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn cực kỳ chậm trong mã nhưng nhanh trong SSMS

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm các ngày Thứ Hai giữa 2 ngày

  2. Giải thích về ANSI_NULLS của Máy chủ SQL

  3. Giải thích tất cả toán tử SQL Server

  4. Làm thế nào để chuyển đổi không gian trống thành giá trị null, sử dụng SQL Server?

  5. Len () so với datalength () trong SQL Server 2005