Ho creato una tabella SQL molto semplice come segue
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]
Ho quindi eseguito un inserto in serie da 3 gig
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Quindi l'utilizzo della RAM per il server SQL è andato alle stelle, consumando ~ 30 Go di RAM:
Preferisco pensare che si tratti di un comportamento anomalo e che sia possibile intervenire per evitarlo.
EDIT:
Ok, questo sembra essere il comportamento predefinito. Giusto.
Tuttavia, perché la memoria non viene liberata a lungo dopo che Bulk Insert è terminato?
Un paio di considerazioni extra:
A partire dai commenti riguardanti il server SQL che libera la memoria quando viene "detto" dal sistema operativo, la mia esperienza pratica su un server Xeon a 32 Gb a 24 core dimostra che questo è inesatto: una volta terminato un estratto BCP Memory-Voracious Ho un pool di istanze .Net della mia applicazione di elaborazione dei dati che devono elaborare i dati estratti, e vengono lasciati soffocare / lottare per condividere la memoria rimanente per provare a svolgere i loro lavori, che impiegano più a lungo rispetto a quando viene girato SQL Server spento e la memoria è disponibile per tutte le applicazioni da condividere. Devo interrompere SQL Server Agent per far sì che tutto vada liscio e impedire che le app si arrestino in modo anomalo per Articiallt causando Eccezione OutOfMemmroy. Per quanto riguarda il limite / limitazione della memoria brutale artificiale, se è disponibile memoria libera, perché non usarlo? Idealmente, preferirebbe essere dinamicamente impostato per adattarsi a ciò che è disponibile piuttosto che limitarsi forzatamente "in modo casuale". Ma suppongo che questo sia un design originale, quindi caso chiuso su quest'ultimo punto.