客戶端直接執行存儲過程正常但代碼調用慢的問題

JAVA調用SQL後臺存儲過程時,有時突然就變得很慢,在後臺直接執行存儲過程沒問題,但在前臺調用存儲過程時就是很慢,而且在前臺調用成功後,再次調用還是一樣的慢,但更新一下存儲過程再調用就很快了。但這始終不能徹底解決問題,過段時間又會出來同樣的問題。

 

解決辦法:

簡單方法一:在可能比較耗時的語句後面加上option(recompile)

 

方法二:新編譯存儲過程
在用諸如添加索引或更改索引列中的數據等操作更改數據庫時,應通過重新編譯訪問數據庫表的原始查詢計劃使其得到重新優化。在重新啓動 SQL Server 後第一次運行存儲過程時自動發生該優化。當存儲過程使用的基礎表更改時也會發生優化。但是如果添加了存儲過程可能從中受益的新索引,將不發生自動優化,直到下一次 SQL Server 重新啓動後再運行該存儲過程時爲止。

SQL Server 提供三種重新編譯存儲過程的方法:  

sp_recompile 系統存儲過程強制在下次運行存儲過程時進行重新編譯。

直接執行:exec sp_recompile @objname=存儲過程名或者function名


創建存儲過程時在其定義中指定 WITH RECOMPILE 選項,表明 SQL Server 將不對該存儲過程計劃進行高速緩存;該存儲過程將在每次執行時都重新編譯。當存儲過程的參數值在各次執行間都有較大差異,導致每次均需創建不同的執行計劃時,可使用 WITH RECOMPILE 選項。此選項並不常用,因爲每次執行存儲過程時都必須對其進行重新編譯,這樣會使存儲過程的執行變慢。


在執行存儲過程時指定 WITH RECOMPILE 選項,可強制對存儲過程進行重新編譯。僅當所提供的參數不典型,或者自創建該存儲過程後數據發生顯著更改時才應使用此選項。  


說明 如果刪除或重命名了存儲過程所引用的對象,那麼在執行該存儲過程時會返回錯誤。但如果用同名對象替換了存儲過程中引用的對象,則可以不進行重新編譯而繼續執行該存儲過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章