2014-01-06 156 views
1

太長我有一個存儲過程,並且當我想用exec proc_name它需要執行1分鐘執行存儲過程花費的時間比執行TSQL

如果我複製從存儲過程的代碼,聲明PARAMS作爲變量,然後執行代碼需要10秒。

怎麼了?

我錯過了這裏的東西?

我在問這是因爲我使用ADO.NET,當我想使用ExecuteNonQuery執行該存儲過程時出現超時錯誤。

謝謝

+0

你肯定是在執行相同的服務器?相同的數據庫? –

+0

閱讀關於參數嗅探 – HLGEM

+0

http://www.sommarskog.se/query-plan-mysteries.html –

回答

8

由於使用了不理想的計劃而造成的。 你提到s.p.有參數,我有類似的問題,由於'parameter sniffing'

查看這是否是問題的最快速檢查僅僅是在SP內部將輸入參數複製到局部變量中,然後僅使用局部變量。

這會阻止例如以某些參數爲代價優化某些參數值。

我以前在s.p.其中有一些int參數,其中某些參數值改變了控制流(以及如何執行查詢)。

+0

使用局部變量解決了我的問題! – user3145

2

啓動SQL事件探查器,並比較這兩個執行:在服務器上花費額外的50分鐘?查詢是否真的一樣?

您可以複製實際的查詢文本並手動運行並檢查執行計劃。

0

嘗試啓動執行計劃圖標的執行過程。 它會告訴你究竟哪個部分需要時間,你/我們可以從那裏接管(建議)。 謝謝

0

作爲一般的想法,當我們談論adhoc語句vs存儲過程時,query plans被緩存。所以執行時間可能會因所選查詢計劃的不同而有所不同。

至於建議,我認爲:

1 /無效與存儲過程相關的查詢計劃:

sp_recompile <procname> 

2 /刪除緩存中的所有查詢計劃(硬的方式,不推薦在PROD除非你很瞭解後果):

DBCC FREEPROCCACHE 

3 /對涉及的表Update statistics

4查看兩種情況下的實際執行計劃並找出性能瓶頸。發佈一些代碼,我們會爲您提供更多詳細信息。