Mesurer l'expulsion d'un plan

9

Nous avons un SQL Server 2016 SP1 avec une mémoire maximale définie sur 24 Go.
Ce serveur a un grand nombre de compilations, seulement 10% de ces compilations proviennent de requêtes ad hoc. Ainsi, les plans nouvellement compilés doivent être stockés dans le cache de plan mais la taille du cache de plan n'augmente pas (environ 3,72 Go).

Je soupçonne qu'il y a une pression de mémoire locale qui conduit à la suppression des plans du cache. La limite de pression du cache du plan est de 5 Go. (75% de la mémoire cible visible de 0 à 4 Go + 10% de la mémoire cible visible de 4 Go à 64 Go + 5% de la mémoire cible visible> 64 Go). Lorsqu'un cache de mémoire atteint 75% de la limite de pression, les plans doivent être supprimés du cache. Dans mon cas, 75% des 5 Go correspondent à 3,75 Go. Il est donc plausible que ce soit la cause des compilations élevées.

Existe-t-il un moyen de mesurer (perfmon, événements étendus, ...) la suppression des plans hors du cache? Je peux donc être certain que la pression de la mémoire locale est vraiment la cause des compilations élevées?

Frederik Vanderhaegen
la source

Réponses:

9

Il y a un XEvent pour ça:

query_cache_removal_statistics

Se produit lorsqu'un plan de requête est supprimé du cache du plan et que les statistiques historiques de l'objet sont sur le point d'être détruites

Donc quelque chose comme:

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

De plus, si le cache de votre plan contient un grand nombre de plans à usage unique, envisagez de définir l' optimisation pour les charges de travail ad hoc .

David Browne - Microsoft
la source