【问题标题】:T-SQL Stored Procedure times out when called from C# - Tried Recompiling从 C# 调用 T-SQL 存储过程超时 - 尝试重新编译
【发布时间】:2012-12-16 23:06:50
【问题描述】:

我有一个在 SQL Server 管理工作室中执行需要 5-10 秒的存储过程。

当从 C# 调用时,它会在 10 分钟后超时:

cmd.CommandTimeout = 600;

我使用 sp_recompile 重新编译查询,还使用 ​​DBCC DROPCLEANBUFFERS 和 DBCC FREEPROCCACHE 来清除任何缓存和执行计划,但均无济于事。

我已经搜索和搜索,但我只找到了指向我上面尝试过的答案。所以我在想,也许我错过了一些更明显的东西?

public static void Action_StoredProc(SqlConnection conn, Boolean map, string acc) {
        SqlCommand cmd = new SqlCommand("Action_StoredProc", conn);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        cmd.Parameters.Add("@map", SqlDbType.Bit).Value = map;
        cmd.Parameters.Add("@acc", SqlDbType.VarChar).Value = acc;
        cmd.CommandTimeout = 600;
        cmd.ExecuteNonQuery();
    }

【问题讨论】:

  • 您是否正确处理了 SqlConnection?
  • 在管理工作室中的 5-10 秒是结果出现之前所需的时间,还是产生所有结果所需的完整时间?
  • AndrásOttó - 是的 @Damien_The_Unbeliever - 这是一系列更新语句,所以没有结果可以产生,但是是的,完成整个 sp 需要 5-10 秒
  • 受影响表上有任何索引吗?
  • 差异可能是由于两个连接上的 ARITHABORT 设置不同而导致的不同计划使用,原因可能是参数嗅探。关于这个主题的规范阅读; Slow in the Application, Fast in SSMS?

标签: c# sql sql-server


【解决方案1】:

如果您使用 SQL Server Profiler,请设置一个正在运行的配置文件,然后在 SSMS 中运行查询,然后从代码中运行。

记下从 SSMS 和您的代码传递的 SET 语句,我猜它们会有所不同。

那么您需要做的就是在代码中针对您的连接明确设置它们,或者将不同的连接添加到您的 SP 的顶部。

【讨论】:

  • 我将使用 Sql 分析器并查看参数嗅探。我会让你知道结果,谢谢:-)
  • 这已通过使用 SQL 的 OPTIMIZE FOR 功能修复。该查询采用两个参数:1. 一个布尔值,仅在特定情况下使用一次,一个 varchar 值,整个查询基于并经常使用。默认情况下,查询已针对布尔值进行了优化。所以问题是参数嗅探,通过在每个更新语句的末尾放置一个选项来优化相关参数,问题就解决了。 "option(OPTIMIZE FOR (@Par UNKNOWN))" - 未知,因为该值不是静态的
【解决方案2】:

我有一个非常相似的情况,即通过 SSMS 执行一个过程需要不到 1 秒的时间,但是从任何代码运行它需要 45 秒才能完成。我们加载 SQL 跟踪,发现执行计划与通过 SSMS 和代码运行的过程不同。为了在这两个地方获得正确的执行计划,我们重新编译了过程,对其进行了更改,清除了数据库中的所有执行计划,等等……但仍然存在问题。

最后,重建过程使用的主表上的统计信息,然后重新编译过程会强制两种执行方法的执行计划相同,从而解决了我们的问题。

命令如下:

UPDATE STATISTICS [TABLE NAME]
GO

EXEC sys.sp_recompile @objname = N''
GO

【讨论】:

    【解决方案3】:

    您可能会发现这篇文章很有帮助:

    应用程序慢,SSMS 快?

    Understanding Performance Mysteries

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      相关资源
      最近更新 更多