web-dev-qa-db-ja.com

プランキャッシュからアドホッククエリをクリアする方法は?

タイトルが示すように、SQL Server 2014/2016のプランキャッシュから、アドホッククエリ(準備されたクエリではない)だけを削除します。これは、メインメモリの50%以上を占めているためです。何か提案はありますか?

どうもありがとう。

5
Commander

したがって、アドホッククエリプランをクリアするだけで、プロシージャキャッシュ全体をクリアする必要はありません。あなたが求めているのはそこにあります あなたのアドホック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
_

そして出力は

enter image description here

写真には_1264_アドホックプランと_69_準備済みステートメントがあることがわかります。

ここで、DBCC FREESYSTEMCACHE('SQL Plans')を使用してSQLCPを選択的にクリアし、クエリを再実行して、以下の出力を取得しました

enter image description here

これで、アドホックプランと準備済みプランがそれぞれ2と6であることがわかります。他は影響を受けませんが。

6
Shanky
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 
4
mhenry1384