Я создал очень простую таблицу SQL следующим образом
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]
Затем я выполнил массовую вставку на 3 гигабайта
BULK
INSERT TickData
FROM
'C:\SUMO.csv'
GO
Затем использование оперативной памяти для SQL-сервера стало стремительным, потребляя около 30 ГБ оперативной памяти:
Я предпочитаю думать, что это ненормальное поведение, и что можно предпринять действия, чтобы этого избежать.
РЕДАКТИРОВАТЬ:
Хорошо, это похоже на поведение по умолчанию. Справедливо.
Тем не менее, почему память не освобождается долго после завершения массовой вставки?
Пара дополнительных соображений:
Что касается комментариев, касающихся SQL-сервера, освобождающего память, когда об этом «сообщает» ОС, то мой практический опыт работы с 24-ядерным 32-гигабайтным сервером Xeon доказывает, что это будет неточно: после завершения извлечения памяти-прожорливого BCP У меня есть пул .Net Экземпляров моего приложения для обработки данных, которые должны обрабатывать извлеченные данные, и они оставляют удушающие / боевые действия, чтобы разделить оставшуюся память, чтобы попытаться выполнить свою работу, что занимает больше времени, чем при включении SQL Server выкл и память доступна для всех приложений, чтобы поделиться. Я должен остановить агент SQL Server, чтобы все прошло гладко и предотвратить сбои приложений для Articiallt, вызвавшего исключение OutOfMemmroy. Что касается искусственного ограничения / ограничения жестокой памяти, если доступна свободная память, почему бы не использовать его? В идеале это было бы динамически настроено на адаптацию к тому, что доступно, а не просто насильственное ограничение «случайным образом». Но я предполагаю, что это не совсем так, поэтому дело закрыто по этому последнему пункту.