Problèmes de requête SQL et de memory vive

J'ai une requête sql que j'essaye de lancer sur un server qui a 8Go de RAM. Si je redémarre le server, il démarre et l'utilisation de la memory est d'environ 1,2 Go.

Si j'exécute ensuite la requête, au moment où la requête est terminée, l'utilisation de la RAM va à environ 4 Go et semble restr là, même pendant la nuit.

Si j'exécute à nouveau la requête (le jour suivant), l'utilisation de la RAM va jusqu'à environ 7 Go et rest là même lorsque la requête est terminée.

Si j'essaie alors d'exécuter à nouveau la requête après avoir attendu 24 heures, l'utilisation de la RAM est toujours à 7 Go, mais cette fois, la requête commence à renvoyer des erreurs de memory insuffisante.

Ma question est, comment puis-je effacer l'utilisation de la memory lorsque la requête est terminée? Idéalement, il serait bon que le script sql lui-même puisse effacer l'utilisation de la RAM une fois son travail principal terminé.


La version du server est:

C'est Microsoft SQL Server 2008 R2 (RTM) – 10.50.1600.1 (X64).


Le message d'erreur est:

System.Data.SqlClient.SqlException (0x80131904): There is insufficient memory available in the buffer pool. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, Ssortingng resetOptionsSsortingng) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Ssortingng method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Ssortingng method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, Ssortingng method) at System.Data.SqlClient.SqlCommand.ExecuteReader() at Project1.Form1.intenseProcess3() in c:\Users\oshirowanen\Documents\Visual Studio 2013\Projects\Project1\Form1.cs:line 117 ClientConnectionId:33f515db-0086-4f88-a8fd-e7779d92d030 Error Number:802,State:20,Class:17 SqlException caught. 

Vous devez définir la memory maximale de votre server pour laisser au less un gig ou deux disponible pour le operating system et tout autre logiciel sur votre server. SQL mettra en cache datatables et ne les libèrera que lorsque vous aurez atteint ses limites.

Utilisez la memory max server pour empêcher le pool de memory tampon SQL Server d'utiliser plus que la quantité de memory spécifiée, laissant ainsi la memory disponible pour démarrer rapidement d'autres applications. SQL Server n'alloue pas immédiatement la memory spécifiée dans la memory maximale du server au démarrage. L'utilisation de la memory est augmentée au besoin par SQL Server jusqu'à atteindre la valeur spécifiée dans la memory maximale du server. SQL Server ne peut pas dépasser cette utilisation de la memory à less que la valeur de la memory max server soit augmentée.

https://msdn.microsoft.com/en-us/library/ms178067%28v=sql.105%29.aspx

Vous pouvez le modifier avec Management Studio en cliquant avec le button droit de la souris sur le server dans la visionneuse d'objects et en sélectionnant les propriétés. Ensuite, modifiez la valeur maximale de la memory du server:

entrez la description de l'image ici

Pour libérer de la memory, vous pouvez utiliser cette command mais elles ne sont utiles que par exemple pour tester la durée d'une requête dans un context constant. SQL Server est suffisamment intelligent pour éloigner l'object de la memory vive lorsque cela est nécessaire.

 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 

Êtes-vous sûr de ne pas utiliser DBCC PINTABLE car cette command force SQL à conserver l'object dans la RAM?