2013-04-02 44 views
14

Tôi có một thủ tục được lưu trữ được nhập vào EF4, và khi tôi gọi nó với một số tham số sau 30 giây, nó sẽ gây ra lỗi hết thời gian. Trong SQL Server profiler tôi có thể nhìn thấy các cuộc gọi thủ tục lưu trữ với các tham số thích hợp chỉ mất hơn 30 giây, đó là thời gian chờ trên ứng dụng của tôi.Entity Framework 4 Thủ tục lưu trữ Gọi Timing Out

BAO GIỜ khi nào tôi thực thi cùng một SQL được gửi đến trình lược tả trong Trình phân tích truy vấn, nó thực hiện phụ thứ hai. Điều gì có thể gây ra sự khác biệt này giữa việc được gọi từ EF và được gọi từ SQL Server Management Studio?

Dấu vết ngăn xếp đầy đủ của lỗi .NET dưới đây.

[SqlException (0x80131904): Hết thời gian chờ. Khoảng thời gian chờ trôi qua trước khi hoàn thành các hoạt động hoặc các máy chủ không phải là đáp ứng.]
System.Data.SqlClient.SqlConnection.OnError (SqlException ngoại lệ, Boolean breakConnection) 2.073.486
System.Data.SqlClient.SqlInternalConnection .OnError (SqlException ngoại lệ, Boolean breakConnection) 5.064.444
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +234
System.Data.SqlClient.TdsParser.Run (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader datastream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 2275
System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33
System.Data.SqlClient.SqlDataReader.get_MetaData() +86
System.Data.SqlClient.SqlCommand.FinishExecuteReader (ds SqlDataReader, runBehavior runBehavior, string resetOptionsString) 311
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, Boolean async) 987
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Chuỗi phương pháp, DbAsyncResult kết quả) 162
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String phương pháp) 32
System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior hành vi, string phương pháp) 141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior hành vi) 12
System.Data.Common.DbCommand.ExecuteReader (CommandBehavior hành vi) 10 System.Data.EntityClient.EntityCommandDefinition .ExecuteStoreCommands (EntityCommand entityCommand, CommandBehavior be havior) +443

[EntityCommandExecutionException: Đã xảy ra lỗi khi thực hiện định nghĩa lệnh. Xem ngoại lệ bên trong để biết chi tiết.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, CommandBehavior behavior) +479
System.Data.Objects.ObjectContext.CreateFunctionObjectResult (EntityCommand entityCommand, EntitySet EntitySet, EdmType edmType, MergeOption mergeOption) 182
System.Data.Objects.ObjectContext.ExecuteFunction (String functionName, MergeOption mergeOption, ObjectParameter [] thông số) 218 ​​
System.Data. Objects.ObjectContext.ExecuteFunction (string functionName, ObjectParameter [] thông số) 53
MetaView.DAL.MFCMData.MFCMDATAEntities.GetTradingOpenPositionCounterParty (Nullable 1 positionDT, Nullable 1 tradingAccountID) trong C: \ Projects \ TIỀN \ web \ MetaView \ MetaView.DAL .MFCMData \ MFCMData.Designer.cs: 7064 MetaView.BusinessLayer.Shared.Accounts.CounterParties .GetCounterParties (Int32 tradingAccountID) trong C: \ Projects \ TIỀN \ web \ MetaView \ MetaView.BusinessLayer \ Shared \ Accounts \ CounterParties.cs: 161

+0

Vui lòng đăng truy vấn và cả hai kế hoạch thực hiện. – usr

Trả lời

23

Vì vậy, tôi đã có một vấn đề tương tự một vài tuần trước , được giải thích cho tôi bởi một trong các DBA của chúng tôi như vậy (được diễn giải và dumbed xuống cấp độ của tôi tất nhiên):

Khi một thủ tục lưu trữ SQL Server được gọi, máy chủ tạo và lưu trữ một kế hoạch thực hiện cho mỗi thủ tục lưu trữ cho mỗi object_id. Đôi khi một kế hoạch thực hiện xấu có thể được tạo ra bởi SQL Server tùy thuộc vào giá trị tham số được truyền vào (trong trường hợp của chúng ta nó là null cho một tham số nullable). Khi điều này xảy ra, sửa chữa nhanh là chạy sp_recompile 'Schema.Procedure' trong SQL Server Management Studio (hoặc bất kỳ công cụ quản lý DB nào bạn có thể đang sử dụng). Tất cả điều này là xóa bộ đệm kế hoạch cho thủ tục đã lưu trữ đó. Nếu callee tiếp theo của proc chuyển giá trị tham số "xấu" lần nữa, bạn sẽ bị kẹt trong cùng một tình huống để sửa lỗi thực là cung cấp truy vấn gợi ý sử dụng cú pháp OPTIMIZE FOR (xem http://msdn.microsoft.com/en-gb/library/ms181714.aspx).

Tóm lại nếu bạn thêm OPTION (OPTIMIZE FOR (@myParameter = 'Some value that gives you a GOOD execution plan')) sau khi các điều khoản WHERE và/hoặc ORDER BY của bạn sẽ khắc phục sự cố.

Ngoài ra, nếu bạn đang tự hỏi tại sao khi thực hiện các cùng SQL trong SSMS bạn luôn có được kết quả nhanh chóng đó là vì SSMS có một thiết lập mặc định của ON cho một tùy chọn gọi ARITHABORT (SET ARITHABORT ON) mà tất cả các ứng dụng khác đã thiết lập để TẮT theo mặc định, nhưng nó hoạt động như thế nào và tác động của nó vượt quá trải nghiệm của tôi và tôi không hề bận tâm đọc nó. Tôi đã được nói rằng tôi không nên sử dụng nó mặc dù. Tôi chắc rằng một DBA thực sự có thể làm tốt hơn việc giải thích lý do tại sao.

+1

Re: ** máy chủ tạo và lưu trữ một kế hoạch thực hiện cho mỗi thủ tục lưu trữ cho mỗi ứng dụng gọi điện thoại (hoặc mỗi chuỗi kết nối. Tôi không nhớ chính xác). ** Trên thực tế, nó không phải là. Kế hoạch được lưu trữ trên mỗi 'object_id', và trong trường hợp của ad hoc sql,' object_id' được dựa trên một băm của văn bản truy vấn (giả định một so sánh nhị phân của tất cả các ký tự). –

+1

@srutzky cảm ơn, tôi đã sửa đổi câu trả lời :) – alimbada

+0

Tôi có exaclty cùng một vấn đề với FUNCTION (với AS TABLE) nhưng OPTION (OPTIMIZE ...) dường như không hoạt động trong ngữ cảnh này. Bạn có ý tưởng nào để giải quyết vấn đề của tôi không? – toregua

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