web-dev-qa-db-ja.com

sys.dm_exec_cached_plansとdm_os_memory_clerksの間の不一致を理解するのに役立ちます

SQL Server 2014インスタンスの1つで、sys.dm_exec_cached_plansに従ってキャッシュされたプランに使用されているメモリの量と、CACHESTORE_SQLCPタイプ(私が理解している)を見てsys.dm_os_memory_clerksに従って使用されているメモリの量との間に奇妙な不一致があります。アドホッククエリのキャッシュプラン用です)。

キャッシュされたプランを次のようにクエリすると、次のようになります。

select cp.cacheobjtype, cp.objtype, 
  sum(cast(cp.size_in_bytes as money))/1024/1024 as sizeMB
from sys.dm_exec_cached_plans as cp
group by cp.cacheobjtype, cp.objtype;

その場合、キャッシュされたプランには合計で約90 MBが使用され、アドホックプランには2MBしか使用されていないようです。キャッシュにも300のプランしかありません。

ただし、dm_os_memory_clerksビューを次のように見ると次のようになります。

select mc.type, mc.pages_kb/1024 as pagesMB
from sys.dm_os_memory_clerks as mc
where mc.type = 'CACHESTORE_SQLCP'

次に、約12GBが使用されていると報告されています。私たちのインスタンスには約があります。 300GBのRAM)。

不一致を理解し、理想的には、プランキャッシュが効果的に使用されるようにいくつかの手順を実行します(つまり、現在非常に低いキャッシュヒット率を改善するために300を超えるプランが含まれています)。このスペースを説明できることが最初のステップになります。

不一致の可能性と、このスペースがキャッシュプランに使用されていない理由について何か考えはありますか?

7
Paul McLoughlin

FWIW-そして私はこれを消化可能なコメントにする方法がないので一時的な答えとしてこれを投稿しているだけです-私はこれらのクエリを実行し、いくつかの矛盾も見ました:

select cp.cacheobjtype, cp.objtype, 
  sum(cast(cp.size_in_bytes as DECIMAL(19,4)))/1024/1024 as sizeMB
from sys.dm_exec_cached_plans as cp
group by cp.cacheobjtype, cp.objtype
ORDER BY sizeMB DESC;

select mc.type, mc.pages_kb/1024 as pagesMB
from sys.dm_os_memory_clerks as mc
where mc.type LIKE N'CACHESTORE[_]%'
ORDER BY pagesMB DESC;

最も注目すべきは、2番目のクエリのCACHESTORE_SQLCPの合計が、最初のクエリの4つのコンパイル済みプランの結果よりも少なく、他のキャッシュストアでもかなりのメモリ担当者が使用されていたことです。これは低いVMで、300GBのRAMはありませんが、これらの数値が常に相関し、うまく加算されるとは限らないことを示しています。

enter image description here

1
Aaron Bertrand