太長我有一個存儲過程,並且當我想用exec proc_name
它需要執行1分鐘執行存儲過程花費的時間比執行TSQL
如果我複製從存儲過程的代碼,聲明PARAMS作爲變量,然後執行代碼需要10秒。
怎麼了?
我錯過了這裏的東西?
我在問這是因爲我使用ADO.NET,當我想使用ExecuteNonQuery
執行該存儲過程時出現超時錯誤。
謝謝
太長我有一個存儲過程,並且當我想用exec proc_name
它需要執行1分鐘執行存儲過程花費的時間比執行TSQL
如果我複製從存儲過程的代碼,聲明PARAMS作爲變量,然後執行代碼需要10秒。
怎麼了?
我錯過了這裏的東西?
我在問這是因爲我使用ADO.NET,當我想使用ExecuteNonQuery
執行該存儲過程時出現超時錯誤。
謝謝
由於使用了不理想的計劃而造成的。 你提到s.p.有參數,我有類似的問題,由於'parameter sniffing'。
查看這是否是問題的最快速檢查僅僅是在SP內部將輸入參數複製到局部變量中,然後僅使用局部變量。
這會阻止例如以某些參數爲代價優化某些參數值。
我以前在s.p.其中有一些int參數,其中某些參數值改變了控制流(以及如何執行查詢)。
使用局部變量解決了我的問題! – user3145
啓動SQL事件探查器,並比較這兩個執行:在服務器上花費額外的50分鐘?查詢是否真的一樣?
您可以複製實際的查詢文本並手動運行並檢查執行計劃。
嘗試啓動執行計劃圖標的執行過程。 它會告訴你究竟哪個部分需要時間,你/我們可以從那裏接管(建議)。 謝謝
作爲一般的想法,當我們談論adhoc語句vs存儲過程時,query plans被緩存。所以執行時間可能會因所選查詢計劃的不同而有所不同。
至於建議,我認爲:
1 /無效與存儲過程相關的查詢計劃:
sp_recompile <procname>
2 /刪除緩存中的所有查詢計劃(硬的方式,不推薦在PROD除非你很瞭解後果):
DBCC FREEPROCCACHE
3 /對涉及的表Update statistics。
4查看兩種情況下的實際執行計劃並找出性能瓶頸。發佈一些代碼,我們會爲您提供更多詳細信息。
你肯定是在執行相同的服務器?相同的數據庫? –
閱讀關於參數嗅探 – HLGEM
http://www.sommarskog.se/query-plan-mysteries.html –