web-dev-qa-db-ja.com

SQL Server 2008は実行プランの作成日を保存しますか?

最近、使用するアプリケーションをアップグレードしました。これには、データベースのスキーマの変更が含まれていました。これらの変更により、キャッシュされた実行プランが強制的に破棄される可能性があります。 SQL Serverが一連の新しいプランの作成を余儀なくされた場合、ユーザーエクスペリエンスが低下する可能性があります。これが事実だったかどうか知りたいのですが。

それで、私の質問は、SQL Server 2008はキャッシュされた実行プランの作成日を保存するのですか?管理ビューsys.dm_exec_cached_plansには日付フィールドがないため、そうではないようです。

13
Eugene M

これは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年に追加され、よりわかりやすい名前を選択する機会が与えられたからです。作成/キャッシュされた時間は、元の計画の作成時間ではなく、最後のコンパイルを反映しています。

12