名前の遅延解決とコンパイル

ストアド プロシージャの作成時に、そのプロシージャ内のステートメントの構文が正しいかどうかが解析されます。プロシージャの定義に構文エラーがあると、エラーが返されてストアド プロシージャは作成されません。ステートメントの構文が正しい場合は、ストアド プロシージャのテキストが sys.sql_modules カタログ ビューに格納されます。

クエリ プロセッサは、ストアド プロシージャの最初の実行時に、sys.sql_modules カタログ ビューからストアド プロシージャのテキストを読み取って、プロシージャで使用されているオブジェクトの名前が存在するかどうかを検査します。ストアド プロシージャが参照するテーブル オブジェクトは、ストアド プロシージャの実行時にのみ存在している必要があり、作成時には存在していなくてもかまわないので、この処理は名前の遅延解決と呼ばれます。

注意

名前の遅延解決は、存在しないテーブル オブジェクトを参照するときのみ使用できます。ストアド プロシージャが作成されるときには、他のすべてのオブジェクトが存在している必要があります。たとえば、ストアド プロシージャ内で既存のテーブルを参照するときは、そのテーブルに存在しない列はリストに指定できません。

Microsoft SQL Server は、名前解決の段階で、他の検証 (列のデータ型と変数の互換性のチェックなど) も実行します。ストアド プロシージャの実行時に、ストアド プロシージャで参照するオブジェクトが不足している場合、ストアド プロシージャは、不足しているオブジェクトを参照するステートメントに達した時点で実行を停止します。このような場合、または名前解決の段階で他のエラーが発生した場合、エラーが返されます。

注意

ストアド プロシージャの参照先オブジェクトが削除されているか、名前が変更されている場合、そのストアド プロシージャを実行するとエラーが返されます。ただし、ストアド プロシージャで参照されているオブジェクトが、同じ名前のオブジェクトで置き換えられている場合は、再作成しなくても、そのストアド プロシージャは実行されます。たとえば、ストアド プロシージャ Proc1 がテーブル Test1 を参照している場合、Test1 が削除されても、別のテーブルが Test1 という名前で作成されると、Proc1 はこの新しいテーブルを参照します。ストアド プロシージャを再作成する必要はありません。

プロシージャの実行が名前解決段階を正常に通過すると、Microsoft SQL Server のクエリ オプティマイザがストアド プロシージャ内の Transact-SQL ステートメントを分析して、実行プランを作成します。実行プランには、次のような情報に基づいて、最も高速にストアド プロシージャを実行する方法が記述されます。

  • テーブル内のデータ量

  • テーブルのインデックスの性質と存在、およびインデックス列内のデータの分散度

  • WHERE 句の条件内で使用されている比較演算子と比較値

  • 結合と UNION、GROUP BY、および ORDER BY の各キーワードの存在

クエリ オプティマイザは、ストアド プロシージャ内のこれらの要素を分析した後に、実行プランをメモリに保存します。ストアド プロシージャを分析して、実行プランを作成する処理をコンパイルと呼びます。メモリ内の最適化された実行プランは、クエリを実行するために使用されます。実行プランは、SQL Server が再起動されるか、または他のオブジェクトを格納する領域が必要になるまで、メモリに残ります。

SQL Server は、既存の実行プランがメモリ内に保存されていれば、ストアド プロシージャが続けて実行された場合に、既存の実行プランを再利用します。実行プランがメモリ内に保存されていなければ、新しい実行プランが作成されます。