快速查询中的SQL超时已过期

3

我正在使用C#对SQL数据库进行大量操作。

但是我一直遇到以下的超时异常:

 System.Data.SqlClient.SqlException:

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

我运行了大量查询(超过100k),并且没有任何一个特定的查询会导致异常 - 有时我可以完成所有查询而不出现异常。

其中一些异常来自作为更大事务的一部分运行的查询,另一些来自单独运行的查询。

当我直接在SQL Server Management Studio中运行相同的查询时,它们只需要不到一秒钟的时间来运行。

我使用相同的SQLConnection对象进行所有查询,但对于每个查询都使用新的SQLCommand对象。

当我尝试使用SQL Server Profiler时,它只显示批处理/RPC已经完成。

为什么我会随机收到此异常?

4个回答

4
您可以尝试在连接字符串中增加超时时间并进行检查。
另一个可能的原因是数据库中存在一些锁,这些锁正在阻止您的查询执行。使用 "sp_lock、sp_who、sp_who2" 进行检查,看看表中是否有任何锁定。

使用 sp_who4 显示实际查询:http://saji-sqlsolutions.blogspot.com/2013/04/spwho4.html - Máster

2

这可能是由于阻塞导致的 - 可能在超时时被另一个进程阻止,该进程正在等待释放锁。这可以解释为什么看起来似乎很随机,因为它取决于当时发生的情况。


我通过将所有内容放入事务中而解决了问题,而不仅仅是其中的一部分 - 现在我从一开始就拥有了所有需要的表的读锁,从而避免了阻塞问题。 - Joda

0
我同意其他建议,检查阻塞/锁定,并查看使用过程中发生了什么。我还肯定会对服务器进行健康检查-检查SQL和NT日志,确保SQL具有足够的内存,并检查等待统计信息以尝试将其最小化。

0

最有可能的解释是锁。如果您正在执行更新,插入或删除操作,请进行分析。重新排列查询可能会有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接