Despejo do plano de medição

9

Temos um SQL Server 2016 SP1 com memória máxima definida como 24 GB.
Este servidor possui um grande 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 planejado é de 5 GB. (75% da memória alvo visível de 0-4GB + 10% da memória alvo visível de 4GB-64GB + 5% da memória alvo visível> 64GB). Quando um armazenamento em cache atinge 75% do limite de pressão, os planos devem ser removidos do cache. No meu caso, 75% dos 5 GB são 3,75 GB. Portanto, é plausível que essa seja a causa das altas compilações.

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 altas compilações?

Frederik Vanderhaegen
fonte

Respostas:

9

Existe um XEvent para isso:

query_cache_removal_statistics

Ocorre quando um plano de consulta é removido do cache do plano e as estatísticas históricas do objeto estão prestes a ser destruídas

Então, algo como:

CREATE EVENT SESSION [PlanCacheEvictions] ON SERVER 
ADD EVENT sqlserver.query_cache_removal_statistics(
    ACTION(sqlserver.sql_text))

Além disso, se o cache do seu plano tiver um grande número de planos de uso único, considere definir a otimização para cargas de trabalho ad hoc .

David Browne - Microsoft
fonte