【问题标题】:.NET Data Adapter Timeout SP Issue.NET 数据适配器超时 SP 问题
【发布时间】:2010-10-29 13:56:35
【问题描述】:

我们有一个 SQL Server 存储过程,可以直接在 SQL 管理器中正常运行,进行相当大的计算,但最多只需要 50-10 秒即可运行。

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

我在谷歌上搜索了这个问题,并看到其他人注意到 SP 直接工作但通过数据适配器调用速度很慢的问题。

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 如果您正在设置 a 超时并且它在该间隔之前超时,那么听起来您没有设置其他超时。向我们展示代码。

标签: .net sql-server dataadapter


【解决方案1】:

直接在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;

【讨论】:

  • 在 SMSS 中,每次我们尝试它时,SP 都运行良好,就像我们通过 .NET 数据适配器一样将参数传递给它。但是,如果我确实强制 SP 重新编译,那么它似乎在 .NET 端工作了一段时间,所以这可能是一个计划缓存问题。不知何故,dataadapter 或 .NET 出现了问题。
【解决方案2】:

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

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

【讨论】:

  • Winforms 应用程序。它再次在 SQL 中运行,但在通过数据适配器调用时不会运行。最重要的是似乎非常不一致,有时它可能会起作用,有时它会超时从应用程序和不同时间运行相同的 SP。我现在不知道为什么。
  • 您可以告诉您的 .Net 代码拉回执行计划。这可能会告诉你一些事情。 eggheadcafe.com/community/aspnet/2/55237/…
【解决方案3】:

改变SqlConnection对象的超时属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-18
    • 2012-10-13
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多