小编Stu*_*ice的帖子

需要帮助从C#诊断SQL Server奇怪的查询超时

我已经开发了许多.NET / SQL Server应用程序,但是我遭受了SQL查询超时的困扰,无法逾越。我在查找有问题的查询并重新索引/重新编写它们方面有丰富的经验。我的Web应用程序使用SQL Server的RDS和Web应用程序的EC2托管在AWS上。我们每天有100-200个唯一身份用户,数据库大约为15GB,其中有两个表大于1GB。

我整天都看到以下异常消息:

'Execution Timeout Expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.'
Run Code Online (Sandbox Code Playgroud)

遭受超时的查询与发生超时的时间一样随机。它似乎与任何显而易见的事情都不相符(备份运行一整夜等)。

我尝试从C#应用程序获取每个查询,然后直接在SQL中运行(使用与Arith Abort相同的SET选项),它们都运行良好。有些查询本质上是较慢的查询,但是最慢的查询在大约2秒钟内运行,并且具有约400k逻辑读取。但是,我还看到查询超时在15毫秒内运行,并且具有<10个逻辑读取。

我看到的最奇怪的事情是,我从Web应用程序中获取了一个查询,并将其编码到已运行24小时的控制台应用程序中,每秒调用一次查询。它没有一个异常/超时,即使我已经看到主系统在运行期间针对同一查询也存在超时。

我最近将RDS服务器升级到了M5 Large,并且每天都在一夜之间重建所有索引。我已经运行DBCC FREEPROCCACHE,以确保没有导致问题的过时查询计划。

我觉得这是参数嗅探,或者我最后的想法是硬件/网络故障,但这确实使人难忘!

我得到的堆栈跟踪看起来像是中间查询,而不是在连接阶段。

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)  
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)  
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)  
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()  
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()  
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()  
   at System.Data.SqlClient.TdsParserStateObject.TryReadByteArray(Byte[] buff, Int32 offset, Int32 len, Int32& totalRead)  
   at System.Data.SqlClient.TdsParserStateObject.TryReadString(Int32 length, String& value)  
   at System.Data.SqlClient.TdsParser.TryReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, …
Run Code Online (Sandbox Code Playgroud)

c# sql-server query-timeout

5
推荐指数
1
解决办法
590
查看次数

标签 统计

c# ×1

query-timeout ×1

sql-server ×1