アドホックステートメントを大量に生成するサードパーティのアプリケーションがあります(サーバーには16 GBのメモリがあり、キャッシュには140000のアドホッククエリが存在します)。クエリキャッシュは肥大化しません。サプライヤーに問い合わせの調整を依頼しましたが、彼はそれらを変更したくありません。
私の質問は、多くのアドホッククエリがサーバーにどのような影響を与える可能性があるかです。私の最初の考えは多くのコンパイルです。
クエリごとに複数の実行プランが保存される可能性があります。クエリテキストの構造化方法(キャリッジリターンの位置など)のわずかな変更は、エンジンによって異なる解釈が行われ、別のクエリと見なされます。
このリンクには、複数のプランを検索するためのスクリプトがあります。 https://www.brentozar.com/blitzcache/multiple-plans/
クエリは、この問題があまり目立たないようにパラメータ化されるのが理想的です。
これは、キャッシュされたプランに利用可能なスペースの量に影響し(プランキャッシュの膨張により)、最適ではないプランが選択される可能性があるため、クエリのランタイムに大きな差異が生じる可能性があります。プランがキャッシュにない場合の再コンパイルは、他の要因になる可能性があります
使用可能なメモリの量に影響を与える可能性があります。各クエリプランは、SQL Serverから少しメモリを奪います。
また、計画を作成する必要があるたびに、SQL Serverはそれをコンパイルする必要があります。つまり、他のプロセスに使用できるCPUを使用します。 CPUの競合が高い場合は、それが問題になる可能性があります。
このクエリは、クエリプランの実際の大きさを確認するのに役立ちます。
SELECT TOP 1000
st.text ,
cp.cacheobjtype ,
cp.objtype ,
cp.refcounts ,
cp.usecounts ,
cp.size_in_bytes ,
cp.bucketid ,
cp.plan_handle
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
WHERE cp.cacheobjtype = 'Compiled Plan'
AND cp.objtype = 'Prepared'
ORDER BY cp.usecounts DESC;