SQL Server长时间运行的查询通过.Net随机超时

4
我们有一个程序连接到我们的数据库并运行一些存储过程以获取一些数据。
数据库是SQL Server 2008,程序在本地运行。连接是通过TCP/IP进行的,但共享内存已启用。连接字符串的超时设置为45秒。
当我们通过SQL Server Management Studio运行它们时,需要0-5秒才能运行。 当我们通过代码运行它时,它会随机超时。
为了进行一些测试,我们将超时时间从45秒增加到几分钟。还为了排除任何阻塞问题,我们检查了存储过程只“选择”数据(没有插入或更新语句)。我们尝试了几个表修改器用于选择语句,如:nolock、readpast等。
我还检查了sp_who2和dbcc opentran(),没有任何阻塞...而.Net的SPID正在运行命令...更详细的信息是,当.Net等待DB答案时,通过SQL Server Management Studio我可以运行相同的语句(存储过程或选择)而没有问题。
有什么建议吗?

你是在调用 SqlConnection.Open() 还是实际执行查询的调用时遇到了 SqlException? - tomfanning
SqlException 返回的代码是超时。但问题在于,SQL Server 似乎没有执行查询(尽管 sp_who2 显示 running command)。 - Alex
我没有问那个。我问的是哪一行代码抛出了异常。这将帮助我们确定是什么出了问题。 - tomfanning
请问您能否包含尽可能多的异常信息文本呢?因为会有几种不同的原因导致超时。 - Damien_The_Unbeliever
请发布.NET和一个问题SP。 - paparazzo
3个回答

5
连接字符串超时只影响登录超时时间。您似乎遇到了命令超时,这只能通过修改CommandTimeout来更改。默认值为30秒,建议值为0(无限超时)。

至于为什么您的过程会出现随机缓慢执行的情况,我建议从阅读应用程序中缓慢,但在SSMS中快速?理解性能谜题开始。

顺便说一句,你的查询很可能没有被阻止。它执行了一个不同的计划,只是需要那么长时间来执行。检查sys.dm_exec_requests中的last_wait_type可能会显示IO等待(PAGEIOLATCH,在排除任何红鲱鱼CXPACKET之后加入sys.dm_os_workers...)。但是没有必要重复Erland Sommarskog最初链接的更全面和优秀的文章。


6
“...建议的值为0(无限超时)。" - 由谁建议,为什么? - Joe
4
如果普遍建议使用 0,我确信默认值就是 0。 - Damien_The_Unbeliever
如果对你有所帮助,我推荐这个。如果查询超时,SSMS会超时,sqlcmd也会超时,甚至引擎本身也会超时。默认的CommandTimeout值与系统事务范围的默认序列化级别落入同一桶中。详情请参考:http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx - Remus Rusanu
@RemusRusanu,您推荐的阅读非常有趣,我学到了很多东西,但并没有解决这个问题。 - Alex

0
如果超时是来自 .net 方面,则将以下两个参数添加到连接字符串中。
Timeout=3600000;
Max Pool Size=360000;

0

有两种超时:连接和查询。

如果您的查询超时,则是查询问题;但由于您说可以通过SQL Server管理工具运行它,我怀疑这不是查询问题。

如果您的连接超时,则很可能是网络问题。我看到您已经尝试了(锁定、提示等),但您假设是查询引起了该问题。尝试从网络方面思考。我听说SQL Server中有活动监视器,可以帮助您在连接期间检测网络问题。


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