Eu criei uma tabela SQL muito básica da seguinte maneira
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]
Em seguida, realizei uma inserção em massa de 3 GB
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Em seguida, o uso da RAM para o servidor SQL disparou, consumindo ~ 30Go de RAM:
Prefiro pensar que este é um comportamento anormal e que medidas podem ser tomadas para evitar isso.
EDIT:
Ok, este parece ser o comportamento padrão. Justo.
No entanto, por que a memória não é liberada muito tempo após o término da inserção em massa?
Algumas considerações extras:
Como nos comentários sobre o SQL Server que libera a memória quando o sistema operacional recebe instruções, minha experiência prática em um servidor Xeon de 24 Gb e 32 Gb prova que isso é inexato: Depois que uma extração de BCP com memória voraz termina Eu tenho um pool de instâncias .net do meu aplicativo de processamento de dados que precisam processar os dados extraídos e eles ficam sufocados / lutando para compartilhar a memória restante para tentar executar seus trabalhos, o que leva muito mais tempo que quando o SQL Server é ativado desligado e a memória está disponível para todos os aplicativos para compartilhar. Eu tenho que parar o SQL Server Agent para que tudo corra bem e impedir que os aplicativos falhem no Articiallt causado pela exceção OutOfMemmroy. Quanto ao limite / limitação artificial da memória brutal, se houver memória livre disponível, por que não usá-lo? Idealmente, preferiria ser definido dinamicamente para se adaptar ao que está disponível, em vez de apenas ser limitado à força "aleatoriamente". Mas eu acho que isso é por projeto, então caso encerrado neste último ponto.