最近、使用するアプリケーションをアップグレードしました。これには、データベースのスキーマの変更が含まれていました。これらの変更により、キャッシュされた実行プランが強制的に破棄される可能性があります。 SQL Serverが一連の新しいプランの作成を余儀なくされた場合、ユーザーエクスペリエンスが低下する可能性があります。これが事実だったかどうか知りたいのですが。
それで、私の質問は、SQL Server 2008はキャッシュされた実行プランの作成日を保存するのですか?管理ビューsys.dm_exec_cached_plans
には日付フィールドがないため、そうではないようです。
これはsys.dm_exec_cached_plans
に保存されておらず、プランXMLのどこにでも埋もれていません。ただし、他のDMVには役立つ情報があります。
ストアドプロシージャの場合、sys.dm_exec_procedure_stats
からプランがキャッシュされた時刻を取得できます。
SELECT TOP(250)
p.name AS [SP Name]
, ps.execution_count
, ps.cached_time
FROM
sys.procedures p WITH (NOLOCK)
INNER JOIN
sys.dm_exec_procedure_stats ps WITH (NOLOCK)
ON p.[object_id] = ps.[object_id]
WHERE
ps.database_id = DB_ID()
ORDER BY
ps.cached_time DESC
OPTION
(RECOMPILE);
アドホッククエリの場合、作成時間はsys.dm_exec_query_stats
にあります。
SELECT TOP(250)
st.[text] AS [QueryText]
, qs.execution_count
, qs.creation_time
FROM
sys.dm_exec_cached_plans cp WITH (NOLOCK)
INNER JOIN
sys.dm_exec_query_stats qs WITH (NOLOCK)
ON qs.plan_handle = cp.plan_handle
CROSS APPLY
sys.dm_exec_sql_text(cp.plan_handle) st
WHERE
cp.objtype = N'Adhoc'
ORDER BY
qs.creation_time DESC
OPTION
(RECOMPILE);
@SqlKiwiによれば、creation_timeからcached_timeへの変更は、手順とトリガーが2008年に追加され、よりわかりやすい名前を選択する機会が与えられたからです。作成/キャッシュされた時間は、元の計画の作成時間ではなく、最後のコンパイルを反映しています。