2

我有一个在 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();
    }
4

3 回答 3

2

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

应用程序慢,SSMS 快?

了解性能奥秘

于 2013-06-04T17:49:19.477 回答
1

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

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

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

于 2013-01-02T17:17:18.453 回答
0

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

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

以下是命令:

UPDATE STATISTICS [TABLE NAME]
GO

EXEC sys.sp_recompile @objname = N''
GO
于 2013-06-04T17:34:43.767 回答