Temos um SQL Server 2016 SP1 com memória máxima definida para 24 GB.
Este servidor tem um alto número de compilações, apenas 10% dessas compilações são de consultas Ad-Hoc. Portanto, os planos recém-compilados devem ser armazenados no cache do plano, mas o tamanho do cache do plano não está aumentando (aproximadamente 3,72 GB).
Suspeito que haja pressão de memória local que leve à remoção de planos do cache. O limite de pressão do cache do plano é de 5 GB. (75% de memória de destino visível de 0-4GB + 10% de memória de destino visível de 4GB-64GB + 5% de memória de destino visível>64GB). Quando um cachestore atinge 75% do limite de pressão, os planos devem ser removidos do cache. No meu caso, 75% de 5 GB são 3,75 GB. Portanto, é plausível que esta seja a causa das compilações altas.
Existe uma maneira de medir (perfmon, eventos estendidos, ...) a remoção de planos fora do cache? Então, posso ter certeza de que a pressão da memória local é realmente a causa das compilações altas?
Existe um XEvent para isso:
Então algo como:
Além disso, se o cache do seu plano tiver um grande número de planos de uso único, considere configurar a otimização para cargas de trabalho ad hoc .