2013-01-02 36 views
2

我有一個存儲過程,需要5-10秒才能在SQL Server管理工作室中執行。當從C#調用時,T-SQL存儲過程超時 - 嘗試重新編譯

當這從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(); 
    } 
+0

你妥善處置的SqlConnection? –

+0

管理工作室需要5-10秒才能顯示結果,或者需要花費所有時間才能生成所有結果? –

+0

AndrásOttó - yup @Damien_The_Unbeliever - 這是一系列更新陳述,所以沒有結果產生,但是是的,它是5-10s才能完成整個sp –

回答

1

如果您使用SQL Server Profiler,請設置配置文件運行,然後在SSMS中運行查詢,然後從代碼運行查詢。

記下從SSMS和您的代碼傳遞的SET語句,我的猜測是它們會有所不同。

然後,所有你需要做的是明確設置對它們在代碼中的連接或那些別共添加到您的SP的頂部。

+0

我將使用SQL事件探查器,也看參數嗅探。我會讓你知道結果,謝謝:-) –

+0

這是固定使用OPTIMIZE FOR SQL的功能。該查詢帶有兩個參數:1.一個布爾值,僅在特定情況下使用一次,以及整個查詢基於並經常使用的varchar值。默認情況下,查詢已針對布爾值進行了優化。 所以,問題是參數嗅探,並通過把一個選項在每個更新語句的結束,以優化所涉及的問題得到解決的參數。 「選項(OPTIMIZE FOR(@Par未知))」 - 未知的,因爲該值不是靜態的 –

0

我有一個非常類似的情況在該過程將需要不到1秒通過SSMS但是從花費45秒完成任何運行的代碼來執行。我們加載了SQL跟蹤,發現執行計劃與通過SSMS和代碼運行的過程不同。爲了在兩個地方得到正確的執行計劃,我們重新編譯了程序,修改了它,清除了數據庫中的所有執行計劃等等,但仍然存在問題。

最後,通過上然後重新編譯程序的過程中使用的主表重建統計被迫執行計劃成爲從而固定我們的問題兩個執行方法是相同的。

下面是命令:

UPDATE STATISTICS [TABLE NAME] 
GO 

EXEC sys.sp_recompile @objname = N'' 
GO 
相關問題