.NET数据适配器超时SP问题

时间:2009-05-28 13:23:35

标签: .net sql-server dataadapter

我们有一个SQL Server存储过程可以直接在SQL Manager中运行,执行相当大的计算,但最多只需要50-10秒才能运行。

然而,当我们通过数据适配器从.NET应用程序调用它时,它会超时。然而,超时发生在超时时间之前,我们将其设置为60秒,并且在约20秒或更短时间内仍然超时。

我用谷歌搜索了这个问题,看到其他人注意到SP直接工作的问题,但是通过数据adpater调用很慢。

有关如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:0)

当你说它在SSMS中直接运行时,你的意思是执行存储过程本身运行正常,或者底层SQL运行正常吗?

根据您的描述,这听起来像参数嗅探的一个例子。基本上,SQL Server已经缓存了一个执行计划,该计划对于一组参数是最佳的,但对于大多数其他参数来说非常差。

您可以在存储过程中的查询上使用RECOMPILE选项强制每次执行时重新编译。如果不经常调用或编译不需要很长时间,则可以使用this trick

另一种解决方案是将存储过程参数复制到局部变量中并使用查询中的变量。例如:

CREATE PROCEDURE my_proc
  @var1 INT
AS
  DECLARE @_var1 AS INT;
  SET @_var1 = @var1;

  SELECT col1, col2, col3
    FROM t1
   WHERE t1.pk = @_var1;

答案 1 :(得分:0)

确保您已检查所有超时。我不知道你是否使用asp.net或winforms,但至少这个列表的前两个将适用:
Time out period not elapsed, but still timing out (see code)?

要检查的另一件事是您正确设置参数。做错了会打破索引。我看到这个地方就是你在varchar列上有一个索引是你查询的关键,并使用普通的“AddWithValue()”或其他没有明确设置的函数为该列设置参数。类型。 .Net默认会给你一个 nvarchar 参数,因为.Net中的字符串是unicode。结果是它无法使用索引。

答案 2 :(得分:0)

更改SqlConnection对象的超时属性