2013-02-28 34 views
5

Tôi hiện đang sử dụng Microsoft Enterprise Library Data Access 5.0 để thực hiện một thủ tục được lưu trữ.Tập lệnh SQL mất nhiều thời gian để chạy

Database myDatabase = DatabaseFactory.CreateDatabase(); 
using (DbCommand command = myDatabase.GetStoredProcCommand("myStoredProc")) 
{ 
    //Add parameters here 
    using (IDataReader dataReader = myDatabase.ExecuteReader(command)) 
    { 
     while (dataReader.Read()) 
     { 
     } 
    } 
} 

Mọi thứ hoạt động tuy nhiên phải mất nhiều thời gian để chạy. Khi tôi bật SQL Profiler, tôi có thể thấy thủ tục lưu trữ mất khoảng 50 giây để chạy. Tuy nhiên, nếu tôi lấy các kịch bản tương tự đó từ Profiler và chạy nó bên trong SQL Management Studio, nó chỉ mất khoảng 480 mili giây để trả về tất cả các hàng.

Có ai gặp sự cố này không? Tại sao lại có sự khác biệt lớn?

+0

có thay đổi nếu bạn xóa vòng lặp while? – JeremyWeir

+0

tôi phải thử và xem. – madatanic

+0

Câu hỏi này xuất hiện một vài lần một tuần trên diễn đàn SQL MSDN; nó phải là một bản sao ở đây là tốt. Tôi quên nguyên nhân chính xác, nhưng nó là một thiết lập mặc định cần phải được tinh chỉnh. –

Trả lời

1

Có thể dễ dàng là Parameter Sniffing.

+0

Vâng, đó là một nguyên nhân tốt khác có thể; không phải là người đang nghĩ đến. –

0

Hãy thử thay đổi loại thông số chuỗi của bạn thành DbType.AnsiString và xem điều đó có hữu ích không.
Vấn đề có thể là nếu cột cơ sở dữ liệu là varchar (...) và có chỉ mục và tham số khớp với cột đó là nvarchar (...) thì SQL Server bỏ qua chỉ mục và thực hiện quét bảng. Giải pháp là buộc tham số gõ AnsiString sao cho SQL Server sử dụng chỉ mục.

Các vấn đề liên quan