SQLServer Profilerでクエリを眺めていたら、
単純なクエリとパラメータを利用したクエリとで
実行結果に違いがあったので気になって色々と調べてみました。
アドホッククエリとパラメータ化クエリ
簡単にしか調べていないので間違えているかもしれないのですが、
アドホッククエリとパラメータ化クエリってのがあるらしいです…( ˘ω˘)
アドホッククエリ
使い捨てのクエリ。
でもSQLServerはアドホッククエリのコンパイル結果を
プロシージャキャッシュに蓄積する。
ガベージコレクションによってキャッシュデータを削除はするが、
一定量貯まったタイミングで動作するので処理の影響が気になる。
SQLServer Profilerでの表示
パラメータ化クエリ
コンパイルは一度だけ行えば良く、
コンパイル済みのクエリにパラメータを与えるだけで
実行可能なクエリ。
上手く使うことでプロシージャキャッシュを有効活用できる。
※クエリの書き方が統一されていないと、異なっているクエリの数だけコンパイルされてしまう。
SQLServer Profilerでの表示
確かに2回目以降はコンパイル済みのクエリを実行しているようです。
おまけ
コンパイル済みのクエリを取得してみた。
use test;
DECLARE @dbid int;
-- 現在使用中のデータベースのidを取得する
SET @dbid = (SELECT DB_ID() AS [Database ID]);
-- キャッシュされたクエリを取得
SELECT TOP 100 text
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle) ss
WHERE dbid = @dbid
AND objtype = 'Prepared'
AND text LIKE '%@P1%'
調べてみないとよくわからん…!




