【轉】解決存儲過程執行快,但C#程序調用執行慢的問題

源博客地址 https://blog.csdn.net/pgbiao/article/details/22388945html

其餘參考:參數探測(Parameter Sniffing)影響存儲過程執行效率解決方案post

                  這篇文章對參數嗅探問題做了很詳細的研究 https://www.cnblogs.com/lyhabc/articles/3222179.html測試

 

這兩天遇到一個問題使人比較鬱悶,一個大概120行左右的存儲過程在SQL Server2012的查詢分析器裏面執行,
速度很是理想,1秒不到,便可篩選抓取到大概500條數據記錄。
但在C#程序代碼裏調用,就提示鏈接超時
。把CommandTimeout設置爲300,就要3分鐘左右時間才能顯示出來,
檢查了幾遍代碼也沒有發現錯誤。問題依舊。

緣由分析:
一、因爲在查詢分析器裏執行速度很快,而且數據量也很少。
二、只在程序裏調用纔有緩慢的狀況。
三、設置CommandTimeout參數,就能夠顯示結果出來,但要好久。

綜上分析,初步判定問題出在C#代碼上。但檢查後沒有收穫。

在百度上查詢這方面的資料。
在CSDN論壇上終於找到相似的資料貼子。其中有一網友在回覆中說「有多是執行計劃過時吧」,
真是一言驚醒夢中的我。

當即在查詢分析器上執行:url

exec sp_recompile @objname='存儲過程名稱'spa

再次測試程序,此次終於成功了。速度很滿意。

緣由分析:
因爲存儲過程是預編譯的, 在第一次執行的時候, 會生成執行計劃, 之後執行的時候, 會使用這個執行計劃(除非存儲過程侯或者顯示指定從新編譯), 而不是每次執行時都去生成執行計劃。
當存儲過程涉及的對象結構調整, 或者相關的數據產生了很大變化, 這可能致使原來的計劃不適合當前的現狀(執行計劃過時), 這種狀況下應該從新編譯存儲過程。
.net

若是修改一次不行,能夠再修改一次,再等會測試htm