sp_recompile (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

會在下次執行預存程式、觸發程式和用戶定義函式時重新編譯。 它會從程式快取卸除現有的計劃,以強制下次執行程式或觸發程式時建立新的計劃。 在 SQL Server Profiler 集合中,會記錄事件 SP:CacheInsert ,而不是事件 SP:Recompile

Transact-SQL 語法慣例

語法

sp_recompile [ @objname = ] N'object'
[ ; ]

引數

[ @objname = ] N'object'

目前資料庫中預存程式、觸發程式、數據表、檢視或使用者定義函數的限定或未限定名稱。 @objname為 nvarchar(776),沒有預設值。

  • 如果 @objname 是預存程式、觸發程式或使用者定義函式的名稱,則下次執行預存程式、觸發程式或函式時,將會重新編譯該預存程式、觸發程式或函式。

  • 如果 @objname 是數據表或檢視表的名稱,則下次執行數據表或檢視時,將會重新編譯所有參考數據表或檢視表的預存程式、觸發程式或使用者定義函式。

傳回碼值

0 (成功) 或非零數字 (失敗)

備註

sp_recompile 只尋找目前資料庫中的物件。

預存程式或觸發程式所使用的查詢,以及使用者定義函式只有在編譯時才會優化。 當索引或其他影響統計數據的變更對資料庫進行時,編譯的預存程式、觸發程式和用戶定義函式可能會失去效率。 藉由重新編譯數據表上作用的預存程式和觸發程式,您可以重新優化查詢。

通常不需要主動執行此預存程式。 SQL Server 會在有利的情況下自動重新編譯預存程式、觸發程式和使用者定義函式。 資料庫引擎可能會選擇重新編譯物件的原因有很多種。 最常見的情況是,由於自動或手動統計數據更新,自動重新編譯會遵循基礎基數估計值的變更。

使用每次執行重新編譯預存程式,是對抗參數化所造成查詢計劃問題的較不有效率方式之一。 SQL Server 2022 (16.x) 中引進的功能 參數敏感性計劃優化 會嘗試自動減輕此問題。 在舊版中,不要使用每個執行呼叫 sp_recompile ,請考慮:

權限

需要指定物件的 ALTER 許可權。

範例

下列範例會在下次執行數據表時重新編譯預存程式、觸發程式和使用者定義函 Sales.Customer 式。

USE AdventureWorks2022;
GO
EXEC sp_recompile N'Sales.Customer';
GO