タイトルが示すように、SQL Server 2014/2016のプランキャッシュから、アドホッククエリ(準備されたクエリではない)だけを削除します。これは、メインメモリの50%以上を占めているためです。何か提案はありますか?
どうもありがとう。
したがって、アドホッククエリプランをクリアするだけで、プロシージャキャッシュ全体をクリアする必要はありません。あなたが求めているのはそこにあります あなたのアドホックSQLプランをクリアしながらあなたのアドホックSQLプランをクリアするSPプランはそのまま
ブログはあなたに走るように頼みます
DBCC FREESYSTEMCACHE('SQL Plans')
ブログの通り
プロシージャキャッシュは、実際には、異なるタイプのプランを保持する4つの異なるキャッシュストアで構成されています。これらのキャッシュストアは次のとおりです。
- CACHESTORE_OBJCP-これらは「オブジェクトプラン」です-ストアドプロシージャ、関数、トリガー。一般的に、良いもの。
- CACHESTORE_SQLCP-これらは "SQLプラン"-アドホックSQLステートメント(パラメーター化されたものを含む)および準備されたステートメントです。これは私たちが求めているものです。
- CACHESTORE_PHDR-ビュー、制約、およびデフォルトのいわゆる「バインドされたツリー」。議論された問題には無関係です。
- CACHESTORE_XPROC-実際の実行計画ではなく、拡張SPのエントリポイントへのポインタ。
したがって、SQLCPをクリアするとselectivelyを実行すると、準備済みの計画と臨時の計画が削除されます。私は自分のシステムでこれをテストしました。
クエリを実行しました
_select objtype,
count(*) as number_of_plans,
sum(cast(size_in_bytes as bigint))/1024/1024 as size_in_MBs,
avg(usecounts) as avg_use_count
from sys.dm_exec_cached_plans
--where objtype='adhoc'
group by objtype
_
そして出力は
写真には_1264
_アドホックプランと_69
_準備済みステートメントがあることがわかります。
ここで、DBCC FREESYSTEMCACHE('SQL Plans')
を使用してSQLCPを選択的にクリアし、クエリを再実行して、以下の出力を取得しました
これで、アドホックプランと準備済みプランがそれぞれ2と6であることがわかります。他は影響を受けませんが。
DECLARE @plan_handle varbinary(64)
DECLARE db_cursor CURSOR FOR
SELECT plan_handle
FROM sys.dm_exec_cached_plans
WHERE objtype = 'Adhoc' -- and usecounts = 1 -- optional: just delete the ones that are used only once
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @plan_handle
WHILE @@FETCH_STATUS = 0
BEGIN
DBCC FREEPROCCACHE (@plan_handle);
FETCH NEXT FROM db_cursor INTO @plan_handle
END
CLOSE db_cursor
DEALLOCATE db_cursor