Ni DBCC FREEPROCCACHE ni DBCC FREESYSTEMCACHE ('Plans SQL') ne font quoi que ce soit pour libérer de la mémoire CACHESTORE_SQLCP

13

CACHESTORE_SQLCP Sql Plans prend> 38 Go après quelques jours.

Nous utilisons déjà l'option "Optimiser pour les charges de travail ad hoc". (Entity Framework et les rapports personnalisés créent de nombreux hocs publicitaires!)

SQL Server 2016 SE 3.00.2164.0.v1 sur AWS RDS avec mise en miroir multi-AZ

Quand je cours:

DBCC FREESYSTEMCACHE('SQL Plans');

ou

DBCC FREEPROCCACHE

ou

DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL

ou

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

Cela ne semble pas le clarifier:

SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb  desc

type                name        pages_kb
CACHESTORE_SQLCP    SQL Plans   38321048

J'exécutais avec Query Store activé, mais je l'ai désactivé pour voir si cela interférait avec quoi que ce soit, cela ne semblait pas aider, mais je l'ai laissé de côté.

Ce qui est vraiment bizarre aussi

SELECT COUNT(*) FROM sys.dm_exec_cached_plans

est 1-3 ou plus (il semble ne montrer que les requêtes en cours d'exécution), même si toute cette mémoire est réservée, avant même que j'essaie d'effacer quoi que ce soit. Qu'est-ce que je rate?

CACHESTORE_SQLCP occupe plus de 60% de toute la mémoire disponible, ce qui est préoccupant car des attentes de mémoire se produisent occasionnellement. De plus, nous avons dû tuer un DBCC CHECKDB de routine pendant le week-end qui durait 4 heures car la mémoire insuffisante empilait les attentes (il s'est terminé instantanément sans aucune erreur avec PHYSICAL_ONLY activé).

Existe-t-il un moyen de récupérer cette mémoire (autre que les redémarrages nocturnes!?)?

Graphique de consommation de mémoire Tableau de consommation de mémoire

Mise à jour à partir des commentaires / réponses

Quand je cours

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

Je reçois

entity_name subentity_name  permission_name
server      CONNECT SQL
server      CREATE ANY DATABASE
server      ALTER ANY LOGIN
server      ALTER ANY LINKED SERVER
server      ALTER ANY CONNECTION
server      ALTER TRACE
server      VIEW ANY DATABASE
server      VIEW ANY DEFINITION
server      VIEW SERVER STATE
server      ALTER SERVER STATE
server      CREATE SERVER ROLE
server      ALTER ANY SERVER ROLE

Qui comprend l' ALTER SERVER STATEautorisation requise .

La sortie de DBCC FREEPROCCACHEest

L'exécution de DBCC est terminée. Si DBCC a imprimé des messages d'erreur, contactez votre administrateur système.

Quel est le message standard. D'autres fonctions DBCC que RDS ne prend pas en charge donnent des messages d'erreur sur les autorisations.

(Un jour plus tard et après avoir exécuté à nouveau, SQL Plans est toujours de 38 321 280 kb)

Mise à jour à partir des commentaires / réponses

SELECT pool_id, name, cache_memory_kb, compile_memory_kb FROM sys.dm_resource_governor_resource_pools

les sorties:

pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080

DBCC FREEPROCCACHE ('internal') ne fait rien différemment

Mise à jour

Le journal des erreurs SQL enregistre les éléments suivants à chaque fois:

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

Mise à jour

Une mise à niveau de la version du moteur sur RDS de 13.00.2164.0.v1 à 13.00.4422.0.v1 est disponible. Bien qu'il soit configuré pour une mise à niveau automatique de la version mineure, il ne semble pas nous tenir au courant. Va redémarrer et installer ce week-end pour voir si cela aide.

Nom de sondage professionnel
la source

Réponses:

5

J'ai mis à niveau vers 13.00.4422.0.v1 (SQL Server 2016 SP1) et redémarré.

Jusqu'à présent, je suis en mesure d'effacer la mémoire de SQL Plan à l'aide de la DBCC FREESYSTEMCACHE('SQL Plans');commande!

Le temps dira pour voir s'il utilise la mémoire un peu plus sage maintenant, mais au moins maintenant, j'ai un moyen de la réinitialiser si elle est à nouveau trop gonflée.

Nom de sondage professionnel
la source
1
Je suggérerais toujours de ne pas effacer fréquemment SQLCP et d'aller de l'avant et de découvrir la cause profonde
Shanky
Entity Framework et une fonction de création de rapports personnalisée qui permet à presque tous les utilisateurs d'exécuter presque toutes les requêtes, d'une certaine manière, crée un grand nombre de requêtes ad hoc. S'il y avait un moyen de simplement les purger, ou même de leur dire de ne jamais être mis en cache en premier lieu, cela pourrait aider. Jusqu'à présent, le cache du plan a oscillé autour de 5,8 Go depuis l'installation du SP1.
Nom de sondage professionnel
Avez-vous activé Optimize for Ad-Hoc Workload. Par rapport à 38G, si elle prend maintenant 5 IG, je pense que ce ne serait pas quelque chose à craindre compte tenu de la charge de travail
Shanky
Oui, Optimiser pour la charge de travail ad hoc est défini (comme indiqué ci-dessus à la question)
Nom de sondage professionnel
1
Nous avons vu ce même problème le 13.0.4001.0. J'ai dû rebondir SQL pour vider le cache de proc. Rien n'était en cours de compilation, mais le cache de proc était «bloqué» et ne s'effacerait pas quoi que nous ayons essayé. Je ne l'ai pas vu se reproduire depuis le rebond de SQL, mais demandez-vous s'il y a une sorte de fuite de mémoire ou de bogue.
GoodwinSQL
3

Exigences

Pour fonctionner DBCC FREEPROCCACHEou DBCC FREESYSTEMCACHEvotre compte nécessite l'autorisation ALTER SERVER STATE.

Les références

Gouverneur des ressources

AWS RDS autorise-t-il les paramètres du gouverneur de ressources? Si oui, alors la syntaxe est:

DBCC FREEPROCCACHE ('<pool_name>'). 

Découvrez si vous avez des piscines avec:

SELECT * FROM sys.dm_resource_governor_resource_pools

Vérification des autorisations

Exécutez la commande suivante pour déterminer si vous disposez de ces autorisations:

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

Limitations / restrictions

Il existe certaines restrictions sur les autorisations accordées aux administrateurs des instances AWS RDS, comme indiqué dans l'article Microsoft SQL Server sur Amazon RDS dans le chapitre Microsoft SQL Server Security

Voici un aperçu:

Les rôles de niveau serveur suivants ne sont actuellement pas disponibles dans Amazon RDS:

  • bulkadmin
  • dbcreator
  • diskadmin
  • securityadmin
  • serveradmin
  • administrateur système

Les autorisations suivantes au niveau du serveur ne sont pas disponibles sur les instances de base de données SQL Server:

  • ADMINISTRER LES OPÉRATIONS EN VRAC
  • MODIFIER TOUT CRÉANCE
  • MODIFIER TOUTE NOTIFICATION D'ÉVÉNEMENT
  • MODIFIER TOUTE SESSION D'ÉVÉNEMENT
  • MODIFIER L'AUDIT DE TOUT SERVEUR
  • ALTER RESSOURCES
  • ALTER SETTINGS (Vous pouvez utiliser les API du groupe de paramètres DB pour modifier les paramètres. Pour plus d'informations, voir Utilisation des groupes de paramètres DB.
  • SERVEUR AUTHENTIFIÉ
  • CONTROL_SERVER
  • CRÉER UNE NOTIFICATION D'ÉVÉNEMENT DDL
  • CRÉER ENDPOINT
  • CRÉER UNE NOTIFICATION D'ÉVÉNEMENT TRACE
  • ENSEMBLE D'ACCÈS EXTERNE
  • SHUTDOWN (Vous pouvez utiliser l'option de redémarrage RDS à la place)
  • ASSEMBLAGE NON SÉCURITAIRE
  • MODIFIER TOUT GROUPE DE DISPONIBILITÉ (SQL Server 2012 uniquement)
  • CRÉER UN GROUPE DE DISPONIBILITÉ (SQL Server 2012 uniquement)

Ces restrictions / limitations peuvent avoir changé depuis la publication du document.

Autres ressources

Brent Ozar a écrit un article " SQL Server RDS " où il a noté que ...

De nombreuses commandes DBCC ne fonctionnent pas du tout - DBCC DBINFOet DBCC LOGINFOont été explicitement refusées. J'ai cependant découvert que je pouvais courir DBCC FREEPROCCACHEaussi souvent que je le voulais.

Gardez à l'esprit que ces limitations peuvent changer au fil du temps - de nouvelles fonctionnalités sont ajoutées régulièrement.

Prise en charge d'Amazon

Si votre compte dispose des autorisations requises et que vous ne pouvez pas libérer de cache, vous souhaiterez peut-être ouvrir un ticket de support avec Amazon.

John aka hot2use
la source
Question mise à jour avec plus de détails basés sur ceci. Merci pour votre réponse réfléchie et détaillée. Je rencontre des problèmes d'autorisations avec d'autres choses dans RDS, mais cela devrait être pris en charge. Je contacterai le support Amazon plus tard dans la journée si je n'obtiens pas beaucoup d'activité ici. Cela ressemblait plus à un problème SQL Server qu'à un problème RDS, et je ne sais pas à quel point leur support sera bien informé ou spécifique par rapport à cette belle communauté!
Nom de sondage professionnel
1
J'apprécie vos commentaires. Je suppose que vous voudrez peut-être ouvrir un ticket avec Amazon ou Microsoft, car rien ne semble fonctionner. Et là encore, il peut s'agir d'un bug ou d'une fonctionnalité (limitation due à ....).
John aka hot2use