web-dev-qa-db-fra.com

SQL Server ne libère pas de mémoire après l'exécution de la requête

Je pense que j'ai ici une question fondamentale que beaucoup auraient pu rencontrer. Lorsque j'exécute une requête dans SQL Server, elle charge en mémoire toutes les données dont elle a besoin pour l'exécution de la requête (par exemple, s'il y a une jointure, elle charge les données nécessaires à partir de ces deux tables) mais lorsque la requête termine l'exécution de la mémoire consommé par SQL Server n'est pas publié.

J'ai remarqué cela parce qu'il y a quelques jours, j'analysais une requête qui occupait beaucoup d'espace tempdb. Lorsque j'exécutais la requête, elle consommait (à la fin de l'exécution) jusqu'à 25 Go de RAM. Ce 25 Go RAM ne serait pas libéré à moins que je ne redémarre le service MSSQLSERVER.

Comment faites-vous la gestion de la mémoire SQL Server? C'est clairement un problème non?

J'aimerais également savoir si vous faites quelque chose de spécifique pour effacer la mémoire utilisée par une seule requête.

Merci d'avance!

32
Kumar Vaibhav

SQL Server est en effet conçu pour demander autant de RAM que possible qui ne seront libérées que si cette mémoire est explicitement requise par le système d'exploitation. Je pense que la meilleure approche consiste à limiter la quantité de RAM que le serveur peut utiliser, ce qui permettra au système d'exploitation d'avoir une quantité définie de ressources à utiliser n'importe quoi. Pour définir cela Comment configurer les options de mémoire à l'aide de SQL Server Management Studio :

Utilisez les deux options de mémoire du serveur, mémoire minimale du serveur et mémoire maximale du serveur , pour reconfigurer la quantité de mémoire (en mégaoctets) gérée par le gestionnaire de mémoire SQL Server pour une instance de SQL Server.

  1. Dans l'Explorateur d'objets, cliquez avec le bouton droit sur un serveur et sélectionnez Propriétés .
  2. Cliquez sur le nœud Mémoire .
  3. Sous Options de mémoire du serveur , entrez la quantité souhaitée pour Mémoire minimale du serveur et Mémoire maximale du serveur .

Vous pouvez également le faire dans T-SQL à l'aide des commandes suivantes (exemple):

exec sp_configure 'max server memory', 1024
reconfigure

Pour limiter la consommation à 1 Go.

Remarque: ce qui précède ne limitera pas tous les aspects de SQL Server à cette quantité de mémoire. Cela contrôle uniquement le pool de tampons et le cache du plan d'exécution. Des choses comme CLR, texte intégral, la mémoire réelle utilisée par les fichiers .exe de SQL Server, l'agent SQL, les procédures stockées étendues, etc. ne sont pas contrôlées par ce paramètre. Cependant, ces autres choses n'ont généralement pas besoin de beaucoup de mémoire, ce sont le pool de tampons et le cache du plan d'exécution qui nécessitent la majeure partie de la mémoire.

J'espère que ça aide.

27
MoonKnight

J'ai moi aussi fait face au même problème mentionné ci-dessus. Mais exécuter la requête ci-dessous en libérant la mémoire RAM mais en moins de 5 heures, la mémoire RAM est occupée. Encore une fois, je dois libérer de force la mémoire RAM.

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’2048'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO

Exécutez ensuite:

2.

EXEC sys.sp_configure N’show advanced options’, N’1' RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’max server memory (MB)’, N’6144'
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N’show advanced options’, N’0' RECONFIGURE WITH OVERRIDE
GO
6
Swami

Je ne pense pas qu'il existe un moyen de forcer SQL Server à libérer de la mémoire. Cependant, vous pouvez limiter l'utilisation de la mémoire.

sp_configure 'max server memory', <memory_size MB>
reconfigure

MSDN

4
Mudassir Hasan

Vieille question, mais je pensais que j'ajouterais mes deux cents. Surtout un riff sur ce qui était dans la réponse ci-dessus en utilisant dsql pour revenir automatiquement à la valeur précédente après avoir réduit la quantité de mémoire. C'est moche, mais ça marche.

IF OBJECT_ID(N'tempdb..##globaltemp') IS NOT NULL
BEGIN
    DROP TABLE ##globaltemp
END

SELECT TOP 1 value
INTO ##globaltemp
FROM sys.configurations
WHERE NAME LIKE '%server memory%'
ORDER BY NAME
OPTION (RECOMPILE);

EXEC sys.sp_configure N'max server memory (MB)'
    , N'1024'
GO

RECONFIGURE
WITH OVERRIDE
GO

DECLARE @dsql AS VARCHAR(20)

SELECT @dsql = cast(value AS NVARCHAR(20))
FROM ##globaltemp

EXEC sys.sp_configure N'max server memory (MB)'
    , @dsql
GO

RECONFIGURE
WITH OVERRIDE
GO
1
Jsjjharp