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%'
調べてみないとよくわからん…!