J'ai une instance SQL Server dont l'utilisation de la mémoire augmente progressivement jusqu'à ce que Windows ne lui en donne plus. Il semble logique que le résultat occasionnel d'une grande requête entraîne la croissance de l'instance.
Existe-t-il un moyen de convaincre SQL Server de libérer la mémoire dont il n'a plus besoin (autre que le redémarrage du service)?
Edit:
j'utilise SQL Server 2000 SQL Server 8.00.2039 - SP4 (Standard Edition)
J'ai pu le découvrir en utilisant la requête suivante:
SELECT 'SQL Server '
+ CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - '
+ CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' ('
+ CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
la source
Les autres affiches sont correctes, c'est par conception, mais vous voulez absolument limiter la mémoire maximale à un peu moins que la RAM de votre serveur. Pensez à cette séquence d'événements:
Pour éviter cela, configurez la limite de mémoire maximale de votre serveur à environ 80 à 90% de votre mémoire physique réelle. Instructions pour SQL 2000 à: http://msdn.microsoft.com/en-us/library/ms178067.aspx
la source
Il ne le libérera que si le système d'exploitation signale qu'il est affamé de RAM, ou si vous arrêtez et redémarrez le service; la chose à faire est de limiter la quantité maximale que SQL utilisera en configurant la valeur de «mémoire maximale du serveur». S'il n'y a rien d'autre sur le serveur qui a besoin de RAM (et j'espère qu'il n'y en a pas), je ne m'en inquiéterais pas.
la source
Donc, pour résumer les réponses:
Il n'y a aucun moyen d'inviter MS SQL Server à libérer de la mémoire dont il n'a pas besoin immédiatement. SQL Server doit libérer automatiquement de la mémoire lorsque cela est nécessaire, mais pas avant. Et si vous rencontrez des problèmes de mémoire, vous devez réduire la valeur de l'option de mémoire "max server memory".
la source
SQL Server consommera de la mémoire et ne la restituera pas, sauf si le système d'exploitation lui indique qu'il y a une pression mémoire. Comme Portman l'a indiqué, cela est voulu par la conception même du produit et si vous souhaitez limiter la consommation de mémoire, vous devez définir la mémoire maximale du serveur que SQL Server utilisera.
la source
N'oubliez pas que le comportement que vous décrivez tous est à partir de SQL Server 2005, lorsque le gestionnaire de mémoire a été réécrit pour (entre autres) répondre aux demandes de pression de mémoire du système d'exploitation.
Pour SQL Server 2000 et avant, une fois qu'il récupère de la mémoire, il ne la rendra pas, peu importe combien le système d'exploitation le crie.
CodeSlave - exécutez-vous sur 2000, 2005 ou 2008?
la source
Vieille question, je sais, mais un moyen de forcer (plus récent, au moins) SQL à libérer de la mémoire est d'écrire une application allouant autant de mémoire que possible en morceaux, en attendant (disons) 15 secondes (par exemple, Sleep (15000)) et la libération de la mémoire allouée et la fermeture; J'ai essayé cela et SQL libère la mémoire pour que le système récupère sa RAM; écrire du code comme ci-dessus est presque trivial en utilisant C / C ++, il suffit de mettre en place une chaîne de stucts pour contenir la chaîne de blocs de mémoire (pointeur et taille), réduire progressivement la taille lorsqu'un "malloc ()" échoue jusqu'à ce qu'il atteigne un minimum (disons moins de 1024) puis parcourez la liste chaînée pour libérer les blocs alloués
la source