Articles

ストアドプロシージャへの再コンパイル

  • 10|28/2019
  • 4分読みます
    • s
    • M
    • M
    • M
    • M
    • M
    • M
    • M
    • d
    • m
    • m
    • m

に適用されます: SQL Server(すべてのサポートされているバージョン)Azure SQLデータベースAzure SQLマネージインスタンスAzure Synapse Analytics並列データウェアハウス

このトピックでは、Transact-sqlを使用してsql serverでストアドプロシージャを再コンパイルする方法について説明します。 これを行うには、プロシージャ定義でRECOMPILEオプションを使用するか、プロシージャが呼び出されたときに、個々のステートメントでRECOMPILEクエリヒントを使用するか、sp_recompileシステムストアドプロシージャを使用する方法があります。 このトピックでは、プロシージャ定義の作成時および既存のプロシージャの実行時にWITH RECOMPILEオプションを使用する方法について説明します。 また、sp_recompileシステムストアドプロシージャを使用して既存のプロシージャを再コンパイルする方法についても説明します。このトピックの内容

  • 始める前に:

    推奨事項

    セキュリティ

  • ストアドプロシージャを再コンパイルするには、次のようにします:

    Transact-SQL

始める前に

推奨事項

  • プロシージャが初めてコンパイルされるか再コンパイルされると、プロシージャのクエリプラン データベースのデータまたは構造が大幅に変更された場合、プロシージャを再コンパイルすると、プロシージャのクエリプランが更新され、それらの変更に対 これにより、プロシージャの処理性能が向上します。

  • プロシージャの再コンパイルを強制する必要がある場合と、自動的に実行される場合があります。 自動再コンパイルは、SQL Serverが再起動されるたびに実行されます。 また、プロシージャーによって参照される基になるテーブルが物理的な設計変更を受けた場合にも発生します。

  • プロシージャを強制的に再コンパイルするもう一つの理由は、プロシージャコンパイルの”パラメータスニッフィング”動作を打ち消すことです。 SQL Serverがプロシージャを実行するときに、プロシージャのコンパイル時に使用されるパラメーター値は、クエリプランの生成の一部として含まれます。 これらの値が、その後にプロシージャが呼び出される一般的な値を表している場合、プロシージャは、コンパイルおよび実行するたびにクエリプランから プロシージャーのパラメーター値が頻繁に非定型である場合、異なるパラメーター値に基づいてプロシージャーと新しいプランの再コンパイルを強制すると、パフォーマ

  • SQL Serverでは、プロシージャのステートメントレベルの再コンパイルが機能します。 SQL Serverでストアドプロシージャを再コンパイルすると、再コンパイルの原因となったステートメントのみがコンパイルされ、完全なプロシージャーはコンパイルされません。

  • プロシージャ内の特定のクエリで非定型または一時的な値が定期的に使用される場合、それらのクエリ内でRECOMPILEクエリヒントを使用することによ クエリヒントを使用するクエリのみが完全なプロシージャではなく再コンパイルされるため、SQL Serverのステートメントレベルの再コンパイル動作は ただし、RECOMPILEクエリヒントでは、プロシージャの現在のパラメーター値を使用するだけでなく、ステートメントのコンパイル時にストアドプロシージャ内のローカル変数の値も使用します。 詳細については、”クエリヒント(Transact-SQL)”を参照してください。

Security

Permissions

WITH RECOMPILE Option
プロシージャ定義の作成時にこのオプションを使用する場合は、データベースのCREATE PROCEDURE権限と、プロシージャが作成され

このオプションをEXECUTEステートメントで使用する場合は、プロシージャに対するEXECUTE権限が必要です。 EXECUTE文自体には権限は必要ありませんが、EXECUTE文で参照されるプロシージャにはexecute権限が必要です。 詳細については、”EXECUTE(Transact-SQL)”を参照してください。

RECOMPILE Query Hint
この機能は、プロシージャが作成され、ヒントがプロシージャ内のTransact-SQLステートメントに含まれるときに使用されます。 したがって、データベースでのCREATE PROCEDURE権限と、プロシージャを作成するスキーマでのALTER権限が必要です。

sp_recompileシステムストアドプロシージャ
指定したプロシージャに対するALTER権限が必要です。

Transact-SQLを使用して

  1. データベースエンジンに接続します。/p>

  2. 標準バーから、”新規クエリ”をクリックします。

  3. 次の例をコピーしてクエリウィンドウに貼り付け、実行をクリックします。 この例では、プロシージャ定義を作成します。

    USE AdventureWorks2012; GO IF OBJECT_ID ( 'dbo.uspProductByVendor', 'P' ) IS NOT NULL DROP PROCEDURE dbo.uspProductByVendor; GO CREATE PROCEDURE dbo.uspProductByVendor @Name varchar(30) = '%' WITH RECOMPILE AS SET NOCOUNT ON; SELECT v.Name AS 'Vendor name', p.Name AS 'Product name' FROM Purchasing.Vendor AS v JOIN Purchasing.ProductVendor AS pv ON v.BusinessEntityID = pv.BusinessEntityID JOIN Production.Product AS p ON pv.ProductID = p.ProductID WHERE v.Name LIKE @Name; 

WITH RECOMPILEオプションを使用してストアドプロシージャを再コンパイルするには

新しいクエリを選択し、次のコード例をコ これにより、プロシージャーが実行され、プロシージャーのクエリプランが再コンパイルされます。

USE AdventureWorks2012; GO EXECUTE HumanResources.uspProductByVendor WITH RECOMPILE; GO

sp_recompileを使用してストアドプロシージャを再コンパイルするには

新しいクエリを選択し、次の例をコピーしてクエリウィンドウに貼り付 これにより、プロシージャーは実行されませんが、プロシージャーが再コンパイルされるようにマークされ、次にプロシージャーが実行されたときにクエリプランが更新されます。

USE AdventureWorks2012; GO EXEC sp_recompile N'dbo.uspProductByVendor'; GO

関連項目

ストアドプロシージャの作成
ストアドプロシージャの変更
ストアドプロシージャの名前の変更
ストアドプロシージャの定義の表示
ストアドプロシージャの依存関係の表示
DROP PROCEDURE(Transact-SQL)