sp_recompile (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
ストアド プロシージャ、トリガー、およびユーザー定義関数を次回実行する際に再コンパイルします。 これを行うために、プロシージャ キャッシュから既存のプランを削除し、次にプロシージャまたはトリガーを実行する際に新しいプランを強制的に作成します。 SQL Server Profiler コレクションでは、 イベントSP:CacheInsert
ではなく イベントがログにSP:Recompile
記録されます。
構文
sp_recompile [ @objname = ] N'object'
[ ; ]
引数
[ @objname = ] N'object'
現在のデータベースにあるストアド プロシージャ、トリガー、テーブル、ビュー、またはユーザー定義関数の修飾名または非修飾名を指定します。 @objname は nvarchar(776)で、既定値はありません。
@objnameがストアド プロシージャ、トリガー、またはユーザー定義関数の名前である場合、次に実行されるときに、ストアド プロシージャ、トリガー、または関数が再コンパイルされます。
@objnameがテーブルまたはビューの名前である場合、テーブルまたはビューを参照するすべてのストアド プロシージャ、トリガー、またはユーザー定義関数は、次回実行されるときに再コンパイルされます。
リターン コードの値
0 (成功) または 0 以外の数値 (失敗)
Remarks
sp_recompile
は、現在のデータベース内のオブジェクトのみを検索します。
ストアド プロシージャ、トリガー、およびユーザー定義関数によって使用されるクエリは、コンパイルされたときにのみ最適化されます。 データベースにインデックスを追加したり、変更を加えたりすると、統計が変化するため、コンパイルされたストアド プロシージャ、トリガー、およびユーザー定義関数の効率が低下する場合があります。 そのテーブルに作用するストアド プロシージャやトリガーを再コンパイルすることにより、クエリを再び最適化できます。
通常、このストアド プロシージャのプロアクティブな実行は不要です。 SQL Server、ストアド プロシージャ、トリガー、およびユーザー定義関数が有利な場合に自動的に再コンパイルされます。 データベース エンジンがオブジェクトの再コンパイルを選択する理由はさまざまです。 最も一般的に、自動再コンパイルは、自動または手動の統計更新により、基になるカーディナリティ推定の変更に従います。
すべての実行でストアド プロシージャを再コンパイルすることは、パラメーター化によって引き起こされるクエリ プランの問題に対処するための効率の低い方法の 1 つです。 SQL Server 2022 (16.x) で導入されたパラメーター依存プランの最適化機能は、この問題を自動的に軽減しようとします。 以前のバージョンでは、各実行で を呼び出す sp_recompile
代わりに、次の点を考慮してください。
- WITH RECOMPILE オプションをクエリに追加します。コードを変更する必要があります。
- プラン ガイドを
WITH RECOMPILE
使用してオプションを適用します。 - コードを
WITH RECOMPILE
変更せずに、クエリ ストア ヒントを使用して オプションを適用します。 - 詳細については、「 パラメーターに依存するプランの問題を含むクエリの解決」を参照してください。
アクセス許可
指定したオブジェクトに対する ALTER 権限が必要です。
使用例
次の例では、テーブルに対 Sales.Customer
して動作するストアド プロシージャ、トリガー、およびユーザー定義関数を次回実行する際に再コンパイルします。
USE AdventureWorks2022;
GO
EXEC sp_recompile N'Sales.Customer';
GO
関連項目
- CREATE PROCEDURE (Transact-SQL)
- CREATE TRIGGER (Transact-SQL)
- システム ストアド プロシージャ (Transact-SQL)
- SQL:StmtRecompile イベント クラス