我有存储过程,每次从web应用程序调用它时,都会疯狂地超时。
我启动了并跟踪了那个时间的调用,最后发现了以下情况:
除了我的web应用程序有自己的用户之外,每件事情都是一样的(数据库、连接、服务器等),我也尝试着与web应用程序的用户直接在工作室中运行查询,它不超过6秒。
我怎么才能知道发生了什么?
我假设这与我们使用BLL > DAL层或表适配器这一事实无关,因为跟踪清楚地表明延迟在实际过程中。这就是我所能想到的。
编辑--我在此链接中发现,ADO.NET将ARITHABORT设置为true --这在大多数情况下都是好的,但有时会发生,建议的解决办法是向存储的proc添加with recompile选项。在我的例子中,它不起作用,但我怀疑它与此非常相似。有人知道ADO.NET还做了什么或者我在哪里可以找到规范吗?
发布于 2012-12-11 15:29:01
我还体验到,查询在web上运行得很慢,在SSMS中运行得很快,我最终发现问题是什么叫做参数嗅探。
我的修正是将sproc中使用的所有参数更改为局部变量。
例如:改变:
ALTER PROCEDURE [dbo].[sproc]
@param1 int,
AS
SELECT * FROM Table WHERE ID = @param1 至:
ALTER PROCEDURE [dbo].[sproc]
@param1 int,
AS
DECLARE @param1a int
SET @param1a = @param1
SELECT * FROM Table WHERE ID = @param1a听起来很奇怪,但它解决了我的问题。
https://stackoverflow.com/questions/6585417
复制相似问题