He creado una tabla SQL muy básica de la siguiente manera
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]
Luego realicé una inserción a granel de 3 conciertos
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Luego, el uso de RAM para el servidor SQL se disparó, consumiendo ~ 30Go de RAM:
Prefiero pensar que este es un comportamiento anormal y que se pueden tomar medidas para evitarlo.
EDITAR:
Ok, este parece ser el comportamiento predeterminado. Lo suficientemente justo.
Sin embargo, ¿por qué no se libera memoria mucho después de que finaliza la inserción masiva?
Un par de consideraciones adicionales:
A partir de los comentarios sobre el servidor SQL que libera la memoria cuando el sistema operativo "lo indica", mi experiencia práctica en un servidor Xeon de 32 Gb y 24 núcleos demuestra que esto es inexacto: una vez que finaliza un extracto BCP con memoria de gran volumen Tengo un grupo de instancias .Net de mi aplicación de procesamiento de datos que necesitan procesar los datos extraídos, y se quedan atorados / peleando para compartir la memoria restante para intentar realizar sus trabajos, lo que lleva mucho más tiempo que cuando se activa SQL Server apagado y la memoria está disponible para todas las aplicaciones para compartir. Tengo que detener el Agente SQL Server para que todo funcione sin problemas y evitar que las aplicaciones se bloqueen porque Articiallt causó la excepción OutOfMemmroy. En cuanto a la limitación / limitación artificial de la memoria brutal, si hay disponible memoria libre, ¿Por qué no usarlo? Idealmente, preferiría establecerse dinámicamente para adaptarse a lo que está disponible en lugar de limitarse forzosamente "al azar". Pero supongo que esto es por diseño, por lo que el caso se cerró en este último punto.