共用方式為


重新編譯預存程序

若由於新增索引或變更索引行中的資料等動作,導致資料庫變更的話,就應該重新編譯用來存取資料表的原始查詢計劃,將它再次最佳化。最佳化會在重新啟動 Microsoft SQL Server 2005 後、首次執行預存程序時自動發生。若預存程序所使用的任何基本資料表有變更,最佳化也會發生。但如果加入新的索引,雖然預存程序可能受益,但在下一次重新啟動 Microsoft SQL Server 後執行預存程序之前,將不會執行最佳化。在這樣的情況下,強制預存程序在下次執行時重新編譯,將非常有用。

另一個強制預存程序重新編譯的理由為,在必要時可抵制預存程序編譯的「參數探測」行為。當 SQL Server 執行預存程序時,程序在編譯時所使用的參數值將包含在產生查詢計劃的一部份中。如果這些值代表程序後續呼叫的典型值,則預存程序在每次編譯和執行時都可獲得查詢計劃的好處。如果沒有,效能就會降低。

ms190439.note(zh-tw,SQL.90).gif附註:
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 選項,就可以強制重新編譯預存程序。如果提供的參數不太正常,或是在建立預存程序後資料已發生顯著的變更,就可以使用這個選項。
    ms190439.note(zh-tw,SQL.90).gif附註:
    如果預存程序所參考的物件已被刪除或重新命名,執行預存程序時就會傳回錯誤。但如果以同名物件取代預存程序中所參考的物件,預存程序就會執行,而不須重新建立。

若要在下一次執行預存程序時重新編譯

請參閱

概念

建立預存程序 (Database Engine)
建立 CLR 預存程序
執行預存程序 (Database Engine)
修改預存程序
檢視預存程序
刪除預存程序

說明及資訊

取得 SQL Server 2005 協助