从C#调用时,T-SQL存储过程超时 - 重试重新编译

时间:2013-01-02 15:21:56

标签: c# sql sql-server

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

当从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();
    }

3 个答案:

答案 0 :(得分:2)

您可能会发现本文有用:

应用程序速度慢,SSMS速度快吗​​?

<强> Understanding Performance Mysteries

答案 1 :(得分:1)

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

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

然后,您需要做的只是在代码中根据您的连接明确设置它们,或者将不同的连接添加到SP的顶部。

答案 2 :(得分:0)

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

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

以下是命令:

UPDATE STATISTICS [TABLE NAME]
GO

EXEC sys.sp_recompile @objname = N''
GO