我们在其中一个网站上遇到了奇怪的连接超时。
我们的环境由IIS 7 Web服务器(在Windows Server 2008 R2标准版上运行)和SQL Server 2008数据库服务器组成。
在调试引起超时的网站功能时,我们注意到连接本身需要几毫秒才能完成,但调用数据库上的存储过程的SqlCommand
在执行期间挂起几分钟,然后加注超时异常。
另一方面,当我们直接在数据库上运行存储过程时,只需2秒即可正确完成执行。
我们已经尝试过以下方法:
SqlCommand
超时web.config
文件sessionState
文件web.config
超时
web.config
文件我们感谢任何帮助。
Nirav
答案 0 :(得分:0)
我的存储过程存在同样的问题,这是用户的搜索功能。我尝试了一切,包括ARTIHABORT等.SP加入了很多表,因为用户可以搜索任何东西。 SP的许多参数都是可选的,这意味着它们在SP中的默认值为NULL。没有任何效果。
我通过确保我的ADO.NET代码仅添加用户选择值的参数来“修复”它。 SP在执行时间内从几分钟到几秒钟。我假设只有具有实际值的参数传递给SP时,SQL Server才能更好地处理执行计划。
请注意,这是针对SQL Server 2000的。
答案 1 :(得分:0)
几年前,在将应用程序从SQL2000迁移到SQL2008时,我遇到了类似的问题。
我将OPTION (RECOMPILE)
添加到数据库中存在问题的所有存储过程的末尾。在我的情况下,它必须与调用存储过程之间非常不同的参数。强制proc重新编译将迫使SQL提出新的执行计划,而不是尝试使用可能对新params不是最佳的缓存版本。
如果您还没有这样做,请检查您的索引。没有什么可以像缺少急需的索引一样杀死数据库性能。这是一个关于查询的良好链接(http://sqlfool.com/2009/04/a-look-at-missing-indexes/),它将显示缺失的索引。
答案 2 :(得分:0)
超级超级晚期建议,但对其他人来说可能会派上用场:我看到并且更适用于Java的典型问题如下:
您有一个以字符串作为参数的查询。该字符串是数据库中varchar(N)列的搜索条件。但是,您在查询中将字符串param提交为Unicode(nvarchar(N))。这将导致全表扫描并将每个字段值转换为Unicode以进行正确比较,以避免潜在的数据丢失(如果SQL Server将输入参数转换为非Unicode,则可能会丢失信息)。
简单测试:运行查询两次(为了简单起见,我假设它是一个SP):
exec spWhatever 'input'
exec spWhatever N'input'
了解他们的行为方式。此外,您可能需要查看SSMS中活动监视器上的“最近的昂贵查询”部分,并询问执行计划,以澄清情况。
干杯, 埃里克