簡體   English   中英

.NET適配器的SQL Server 2005超時

[英]Sql Server 2005 Timeouts With .NET Adapters

我正在運行一個查詢,該查詢從C#TableAdapter返回約30,000行,並且經常出現以下錯誤:

Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. 

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)\r\n   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)\r\n   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)

如果我運行相同的查詢而返回的行較少,則不會收到錯誤。 如果我運行的查詢與C#中的TableAdapter自己在SSMS中運行的查詢完全相同,則30,000行的查詢返回的結果很好。

是什么原因造成的?

編輯:SSMS中的查詢需要〜7秒

您應該延長查詢的超時時間以獲取結果。 由於結果集很大,因此查詢可能需要一些時間才能完成。 最有可能在生成結果之前超時時間已到

您可以使用SQLCommand的CommandTimeout屬性設置過期時間。 將其設置為長時間進行測試,並檢查是否獲得結果

這可能是索引問題。 特別是因為您說過查詢在SSMS中運行,但不在代碼中運行。 請參閱這篇文章,其中包含更多信息(並且是IMO的不錯閱讀):

http://www.sommarskog.se/query-plan-mysteries.html

查詢需要多長時間? 使用SQL並直接在數據庫中運行它,速度有多快? 如果要花費很長時間,可能需要使用索引或其他調整方法將其打開。

您可以增加超時時間,但是為什么返回30,000條記錄。 如果這不是后台進程,則應將查詢設置為分頁以一次返回X條記錄。

如果您絕對需要30,000條記錄:

使用DataReader時,它比數據適配器更快且資源占用更少,請記住它使用僅轉發(防火牆)方法進行數據恢復。

一次大塊地提取記錄,例如提取1000,處理,提取1000,過程...

.Net中的超時調整查詢以使其運行更快

如果數據不穩定,則考慮是否緩存30,000條記錄

這是推測性的,但您可能會遇到參數嗅探實例,從而導致問題。

http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/

快速解決方案是添加局部變量,將參數值復制到局部變量,然后在查詢中使用局部變量。 從上面的文章

CREATE PROCEDURE MyProcedure
     @UserName nvarchar(20)
 AS

 BEGIN
     DECLARE @myUserName nvarchar(20)
     SET @myUserName = @UserName
     -- Insert statements for procedure here
     SELECT DisplayName, FirstName, LastName 
     FROM dbo.User
     WHERE UserName = @myUserName

END

有關此處實際發生情況的更多信息,請訪問: http : //www.sqlpointers.com/2006/11/parameter-sniffing-stored-procedures.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM