【SQLServer】アドホッククエリとパラメータ化クエリ

SQLServer Profilerでクエリを眺めていたら、
単純なクエリとパラメータを利用したクエリとで
実行結果に違いがあったので気になって色々と調べてみました。

アドホッククエリとパラメータ化クエリ

簡単にしか調べていないので間違えているかもしれないのですが、
アドホッククエリとパラメータ化クエリってのがあるらしいです…( ˘ω˘)


アドホッククエリ

使い捨てのクエリ。
でもSQLServerはアドホッククエリのコンパイル結果を
プロシージャキャッシュに蓄積する。
ガベージコレクションによってキャッシュデータを削除はするが、
一定量貯まったタイミングで動作するので処理の影響が気になる。

SQLServer Profilerでの表示

アドホッククエリ


パラメータ化クエリ

コンパイルは一度だけ行えば良く、
コンパイル済みのクエリにパラメータを与えるだけで
実行可能なクエリ。
上手く使うことでプロシージャキャッシュを有効活用できる。
※クエリの書き方が統一されていないと、異なっているクエリの数だけコンパイルされてしまう。

SQLServer Profilerでの表示

パラメータ化クエリ(初回)

パラメータ化クエリ(2回目以降)

確かに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%'

調べてみないとよくわからん…!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です