少しわかりにくいタイトルですが。
ストアドプロシージャやパラメーター化クエリは初回コンパイルされた後は再利用されることになります。
初回コンパイル時にどのようなパラメーターを使用してコンパイルされたのかを確認する方法をまとめてみたいと思います。
以下のような一つのパラメーターを引数として実行されるストアドプロシージャがあります。
このストアドプロシージャの初回実行時には初回実行時に使用されたパラメーターを元にコンパイルされ、実行プランが生成されそれが再利用されていくことになります。
どのような実行プランが作成されたかをキャッシュから確認する場合は以下のようなクエリを実行することで情報が取得できます。
SELECT |
取得した結果の query_plan の XML のリンクからキャッシュされているプランをグラフィカルに表示することができます。この時に最終の結果のアイコンを選択し、プロパティの [Parameter List] を確認することでコンパイル時に使用されたパラメーター (Parameter Compiled Value) を確認することができます。
ストアドプロシージャを実際の実行プランを表示して実行した場合には、キャッシュされているプランのパラメーター (Parameter Compiled Value) と実行時に使用したパラメーター (Parameter Runtime Value) が表示されます。
この情報はパラメーター化クエリでも同じように取得することができます。
以下のようなクエリを実行した場合は、
DECLARE @val uniqueidentifier |
以下のようなクエリで情報を取得するうことができます。
# ストアドプロシージャの情報であれば、sys.dm_exec_procedure_stats から取得できますが、パラメーター化クエリに関しては sys.dm_exec_query_stats から取得します。ストアドプロシージャも sys.dm_exec_query_stats から取得できますので、こちらで統一してしまってもよいかもしれないですね。
SELECT |
キャッシュされているプランがどのようなパラメーターを使用して実行されたのかを確認したい場合には Parameter List から確認するとよいかと。
検証環境で再現テストをしたい場合などにもこの辺を把握しておくと役に立ちそうですね。