回答:
いくつかのことがわかった
select * from sys.dm_exec_query_stats
キャッシュされたすべてのクエリプランが表示されます。残念ながら、そこにはSQLテキストは表示されません。
ただし、次のようにSQLテキストをプランに結合できます。
select plan_handle, creation_time, last_execution_time, execution_count, qt.text
FROM
sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text (qs.[sql_handle]) AS qt
ここからWHERE
、クエリに含まれていることがわかっているSQLを見つけるための句を追加して、実行することができます。
DBCC FREEPROCCACHE (plan_handle_id_goes_here)
クエリプランキャッシュから各クエリプランを削除します。簡単でも便利でもありませんが、機能しているようです。
編集:クエリキャッシュ全体をダンプすることも機能し、少なくとも私の経験では、思ったより危険ではありません。
DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;
良い計画がどのように見えるかを知っているなら、単に計画のヒントを使用してください。
特定のキャッシュエントリを削除することはできませんが、を使用してキャッシュプール全体をクリーンアップできますDBCC FREESYSTEMCACHE(cachename/poolname)
。
あなたは(からの平面ハンドルを持っている場合は、不正なクエリプランのキャッシュ名を取得することができますsys.dm_exec_requests.plan_handle実行中のトラブルでsession_idのための、またはからsys.dm_exec_query_statsポストの実行):
select ce.name
from sys.dm_exec_cached_plans cp
join sys.dm_os_memory_cache_entries ce on cp.memory_object_address = ce.memory_object_address
where cp.plan_handle = @bad_plan
ただし、すべてのSQLプランには「SQLプラン」という名前が付いているため、DBCC FREESYSTEMCACHEに適したプランを選択するのは難しい選択です。
更新
気にせDBCC FREEPROCCACHE(plan_handle)
ず、忘れてしまいました、はい、うまくいきます。
sys.dm_exec_cached_plans
エントリがない場合はどういう意味ですか?plan_handle
sys.dm_exec_requests
FREEPROCCACHEのソリューションは結構ですが、これを行うためのより直接的な方法は、使用することですOPTION(RECOMPILE)をおそらくあなたが疑われるので、これはエンジンにそのシングルユース計画を伝え、(あなたはそれがSPではなかった言及した)あなたのSQL文字列にパラメータスニッフィングがあるか、統計が実行ごとに大幅に異なるため、キャッシュプランの問題が疑われます。
DECLARE @SQL NVARCHAR(4000)
SELECT @SQL = 'SELECT * FROM Table WHERE Column LIKE @NAME OPTION (RECOMPILE)'
EXEC sp_executesql @SQL, N'@NAME varchar(15)', 'MyName'