在執行諸如添加索引或更改索引列中的數據等操作更改了數據庫時,應重新編譯訪問數據庫表的原始查詢計劃以對其重新優化。在 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)