在執行諸如添加索引或更改索引列中的資料等操作更改了資料庫時,應重新編譯訪問資料庫表的原始查詢計劃以對其重新最佳化。在 Microsoft SQL Server 2005 重新啟動後第一次運行預存程序時自動執行此最佳化。當預存程序使用的基礎資料表發生變化時,也會執行此最佳化。但如果添加了預存程序可能從中受益的新索引,將不自動執行最佳化,直到下一次 Microsoft SQL Server 重新啟動後再運行該預存程序時為止。在這種情況下,強制在下次執行預存程序時對其重新編譯會很有用。
必要時,強制重新編譯預存程序的其他原因會阻礙預存程序編譯的“參數尋找”行為。當 SQL Server 執行預存程序時,該過程在編譯時間使用的任何參數值都作為產生查詢計劃的一部分包括在內。如果這些值就是後來調用預存程序時使用的典型值,則該預存程序在每次編譯和執行時都會從查詢計劃中獲益。否則,效能可能會受到影響。
注意:
SQL Server 2005 引入了對預存程序執行語句級重新編譯功能。當 SQL Server 2005 重新編譯預存程序時,只編譯導致重新編譯的語句,而不編譯整個過程。因此,SQL Server 重建查詢計劃時,使用重新編譯過的語句中的參數值。這些值可能與那些原來傳遞至過程中的值不同。
強制重新編譯預存程序
SQL Server 中,強制重新編譯預存程序的方式有三種:
sp_recompile 系統預存程序強制在下次執行預存程序時對其重新編譯。
建立預存程序時在其定義中指定 WITH RECOMPILE 選項,指明 SQL Server 將不為該預存程序緩衝計劃,在每次執行該預存程序時對其重新編譯。當預存程序的參數值在各次執行間都有較大差異,導致每次均需建立不同的執行計畫時,可使用 WITH RECOMPILE 選項。此選項並不常用,因為每次執行預存程序時都必須對其重新編譯,這樣會導致預存程序的執行變慢。
如果只想在要重新編譯的預存程序而不是整個預存程序中執行單個查詢,請在要重新編譯的每個查詢中指定 RECOMPILE 查詢提示。此行為類似於前文所述的 SQL Server 語句級重新編譯行為,但除了使用預存程序的當前參數值外,RECOMPILE 查詢提示還在編譯語句時使用預存程序中本地變數的值。請僅在屬於預存程序的查詢子集中使用非典型值或臨時值時使用此選項。有關詳細資料,請參閱查詢提示 (Transact-SQL)。
可以通過指定 WITH RECOMPILE 選項,強制在執行預存程序時對其重新編譯。僅當所提供的參數是非典型參數,或自建立該預存程序後資料發生顯著變化時,才應使用此選項。
注意:
如果刪除或重新命名了預存程序所引用的對象,那麼在執行該預存程序時會返回錯誤。但如果用同名對象替換了預存程序中引用的對象,則可以不必重新建立即可執行該預存程序。
下次運行預存程序時對其重新編譯
sp_recompile (Transact-SQL)