最大メモリが24GBに設定されたSQL Server 2016 SP1があります。
このサーバーには多数のコンパイルがあり、これらのコンパイルの10%のみがアドホッククエリからのものです。そのため、新しくコンパイルされたプランはプランキャッシュに保存する必要がありますが、プランキャッシュのサイズは増加していません(約3.72GB)。
キャッシュからのプランの削除につながるローカルメモリのプレッシャーがあると思います。プランのキャッシュ圧力制限は5GBです。 (0-4GBの可視ターゲットメモリの75%+ 4GB-64GBの可視ターゲットメモリの10%+可視ターゲットメモリの5%> 64GB)。キャッシュストアが圧力制限の75%に達したら、プランをキャッシュから削除する必要があります。私の場合、5 GBの75%は3.75GBです。したがって、これが高コンパイルの原因であると考えられます。
キャッシュからのプランからの削除を測定する方法(perfmon、拡張イベントなど)はありますか?だから、私はローカルメモリのプレッシャーが本当に高コンパイルの原因であると確信できますか?
そのためのXEventがあります。
query_cache_removal_statistics
クエリプランがプランキャッシュから削除され、オブジェクトの履歴統計が破棄されようとしているときに発生します
だから次のようなもの:
CREATE EVENT SESSION [PlanCacheEvictions] ON SERVER
ADD EVENT sqlserver.query_cache_removal_statistics(
ACTION(sqlserver.sql_text))
また、プランキャッシュに多数の使い捨てプランがある場合は、 アドホックワークロード用に最適化 の設定を検討してください。