2017-04-14 238 views
1

我有SQL Server 2016.存在兩個完全相同的具有不同名稱的存儲過程,但它們的執行方式不同。首先在17分鐘內完成,其餘在18秒內完成。 首先在創建元素之一的索引之前創建,但重新編譯並清除了計劃緩存中的所有計劃。 結果不會改變。SQL Server存儲過程執行差異

它可能是什麼問題,以及如何重新配置​​執行計劃?

+0

看看像ARITHABORT,XACT_ABORT等存儲過程的設置,它們都影響執行計劃。創建proc時,當時有效的設置「粘」在proc的元數據中並影響計劃。 – Brandon

+0

你使用過sp_recompile嗎?在你這樣測試的時候可能會考慮的事情是將一個WITH RECOMPILE放在存儲過程中,以強制優化器爲每個命令獲取一個新的查詢計劃。您可能還想在測試之前更新統計信息。如果參數相同並且查詢是相同的,那麼應該不會像上面提到的那樣有17分鐘的差異。另一方面,如果你的sp有許多參數,或者它們在語句中以非傳統方式使用,那麼可能需要使用OPTIMIZE FOR UNKNOWN(< - 在測試期間)來防止參數嗅探問題。 –

+0

重新編譯聲明:「EXEC sp_recompile N'ProcedureName'; GO DBCC FREEPROCCACHE WITH NO_INFOMSGS;」 –

回答

0

爲了提高存儲過程的性能,必須將腳本執行得更低。它可以幫助重新創建執行計劃。

EXEC sp_recompile N'ProcedureName'; 
GO 
DBCC FREEPROCCACHE WITH NO_INFOMSGS; 
GO 
EXEC sp_updatestats; 
GO 
+0

是否爲你工作,或者你只是記錄你所嘗試過的? –

+1

是的,它工作。第一次執行大約2分鐘,所有下一次執行時間大約是18秒。 –