解決儲存過程執行快,但程式呼叫則執行慢的問題
阿新 • • 發佈:2021-10-11
這兩天遇到一個問題令人比較鬱悶,一個大概120行左右的儲存過程在SQL Server2012的查詢分析器裡面執行,
速度非常理想,1秒不到,即可篩選抓取到大概500條資料記錄。
但在C#程式程式碼裡呼叫,就提示連線超時。把CommandTimeout設定為300,就要3分鐘左右時間才能顯示出來,
檢查了幾遍程式碼也沒有發現錯誤。問題依舊。
原因分析:
1、由於在查詢分析器裡執行速度很快,並且資料量也不多。
2、只在程式裡呼叫才有緩慢的情況。
3、設定CommandTimeout引數,就可以顯示結果出來,但要很久。
綜上分析,初步斷定問題出在C#程式碼上。但檢查後沒有收穫。
在百度上查詢這方面的資料。
在CSDN論壇上終於找到類似的資料貼子。其中有一網友在回覆中說“有可能是執行計劃過期吧”,
真是一言驚醒夢中的我。
立即在查詢分析器上執行:
exec sp_recompile @objname='儲存過程名稱'
再次測試程式,這次終於成功了。速度很滿意。
原因分析:
由於儲存過程是預編譯的, 在第一次執行的時候, 會生成執行計劃, 以後執行的時候, 會使用這個執行計劃(除非儲存過程侯或者顯示指定重新編譯), 而不是每次執行時都去生成執行計劃。
當儲存過程涉及的物件結構調整, 或者相關的資料產生了很大變化, 這可能導致原來的計劃不適合當前的現狀(執行計劃過期), 這種情況下應該重新編譯儲存過程。