J'ai créé une table SQL très basique comme suit
CREATE TABLE [dbo].[TickData](
[Date] [varchar](12) NULL,
[Time] [varchar](12) NOT NULL,
[Symbol] [varchar](12) NOT NULL,
[Side] [varchar](2) NOT NULL,
[Depth] [varchar](2) NOT NULL,
[Quote] [varchar](12) NOT NULL,
[Size] [varchar](18) NOT NULL
) ON [PRIMARY]
J'ai ensuite effectué une insertion en vrac de 3 Go
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Ensuite, l'utilisation de la RAM pour le serveur SQL est passée à Skyrock, mangeant environ 30 Go de RAM:
Je préfère penser qu'il s'agit d'un comportement anormal et que des mesures peuvent être prises pour éviter cela.
EDIT:
Ok, cela semble être le comportement par défaut. C'est suffisant.
Cependant, pourquoi la mémoire n'est-elle pas libérée longtemps après la fin de l'insertion en bloc?
Quelques considérations supplémentaires:
En ce qui concerne les commentaires concernant le serveur SQL libérant de la mémoire lorsqu'elle est "informée" par le système d'exploitation, mon expérience pratique sur un serveur Xeon à 24 cœurs 32 Go prouve que cela est inexact: une fois qu'un extrait BCP Memory-Voracious est terminé J'ai un pool d'instances .Net de mon application de traitement de données qui doivent traiter les données extraites, et elles sont étouffées / se battent pour partager la mémoire restante pour essayer d'effectuer leurs travaux, ce qui prend plus de temps que lorsque SQL Server est tourné désactivé et la mémoire est disponible pour toutes les applications à partager. Je dois arrêter l'Agent SQL Server pour que tout se passe bien et empêcher les applications de se bloquer pour Articiallt, à l'origine de l'exception OutOfMemmroy. En ce qui concerne le plafonnement / limitation de la mémoire brutale artificielle, si la mémoire libre est disponible, pourquoi ne pas l'utiliser? Idéalement, il serait préférable de s'adapter de manière dynamique à ce qui est disponible plutôt que d'être limité de manière "aléatoire". Mais je suppose que cela est intentionnel, donc le dossier est clos sur ce dernier point.