前言
最近,在工作中發現,兩個問題:
1.應用程序調用存儲過程很慢,但是在查詢分析器中把SQL語句拿出來執行存儲過程就很快。
2.在查詢分析器中執行存儲過程很慢,但是把存儲過程中的內容拿出來執行很快
問題的分析與解決
問題1 產生原因
在應用程序中(或者在查詢分析器中)調用存儲過程的時候,存儲過程的執行計划是被緩存了,就算參數不同,還是按照老的執行計划查詢,效率也會不同。
問題1 解決方法
直接在存儲過程定義參數的最后,添加WITH RECOMPILE 就會被強行重新編譯執行存儲過程
如下圖代碼所示:
ALTER PROCEDURE PRO_NAME
(
@PARA1 VARCHAR(100)
) WITH RECOMPILE
問題2 產生原因
在執行存儲過程中出現了參數嗅探
問題2 解決方法
如果存儲過程調用的比較頻繁可使用OPTION (OPTIMIZE FOR UNKNOWN),如果不是,可使用OPTION (RECOMPILE) 。
因為業務需要,存儲過程需要頻繁使用,所以,使用了OPTION (OPTIMIZE FOR UNKNOWN) 處理。
具體使用代碼示例如下:
ALTER PROCEDURE PRO_NAME
(
@PARA1 VARCHAR(100)
) WITH RECOMPILE
AS
BEGIN
SELECT * FROM TABLE_NAME WHERE FIELD_NAME=@PARA1 OPTION (OPTIMIZE FOR UNKNOWN)
END
以上,親測有效~
