我有一个存储过程,每次从Web应用程序调用它都会疯狂地超时.
我启动了Sql Profiler并跟踪了那些超时的调用,最后找到了这些东西:
除此之外,我的web应用程序都有自己的用户事实上,每一件事情是相同的(相同的数据库,连接,服务器等),我也试过直接与Web应用程序的用户的工作室运行查询,并没有花费超过6秒.
我怎样才能知道发生了什么?
我假设它与我们使用BLL> DAL图层或表适配器这一事实无关,因为跟踪清楚地显示了延迟在实际过程中.这就是我所能想到的.
编辑我在这个链接中发现ADO.NET设置ARITHABORT为true  - 这在大多数情况下是好的,但有时会发生这种情况,建议的解决方法是向with recompile存储过程添加选项.在我的情况下,它不起作用,但我怀疑它与此非常相似.任何人都知道ADO.NET做了什么或者我在哪里可以找到规范?
我有一个带签名的T-SQL存储过程
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
在Sql Server中直接执行时,该过程在5秒内运行,返回一些总计约100行的结果集.
调用使用ADO.NET此过程SqlDataAdapter.Fill方法来填充Dataset导致SqlTimeoutException在SqlCommand3分钟后(指定的超时间隔).
更改存储过程以使其不再具有输出参数,并且所需的输出值作为最后的结果集返回,解决了问题,并且整个过程在预期的5秒内运行.
但为什么?
我不想通过我的代码库来修改这种行为的所有实例,而不理解我是否真的解决了这个问题.
另一件需要注意的是,这只在一个特定的服务器上显而易见,它确实拥有比我们运行的其他类似数据库更大的数据集.肯定不是Sql Server设置?
UPDATE
进入框架源,问题似乎出现在元数据检索中.对象的ConsumeMetaData方法SqlDataReader无限期挂起.但是我在其他数据库上运行测试并且无法重现,因此当通过ADO.NET调用此过程时,这是一个特定于数据库的问题...很棒.
更新II
已确认如果我将代码更改为使用OleDbDataAdapterSQLOLEDB或SQLNCLI提供程序类型,则问题仍然存在.绝对与连接有关.
我已经有这个问题了几个星期了.问题是查询需要4-5分钟才能在网站上运行,最多需要2或3秒才能在ssms中运行.此外,我发现在对此查询进行更改后,例如添加customerId变量,它将在网页上快速开始运行,但到第二天它再次变慢.有问题的查询是这样的:
DECLARE @customerID INT
SET @customerID = @CustID
DECLARE @MyTable table(
Iden int NOT NULL IDENTITY(1,1),
ProductID int)
INSERT INTO @MyTable(ProductID)
SELECT P.ProductID FROM Product P WITH (NOLOCK)
left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)
SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK) 
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN @MyTable …使用SQL Server 2005,在几个大表上有一个SQL查询,它在程序中超时.但是,当我在查询分析器中运行它时,它在大约30秒内完成.
为什么不同?