Назад | Перейти на главную страницу

Проблема с массовой вставкой физической памяти SQL Server

У меня есть сценарий, который последовательно выполняет 15 операций массовой вставки в базу данных SQL Server, все на основе приведенной ниже:

BULK INSERT M_USERS
    FROM '\\spath\users.txt'
    WITH ( 
        BATCHSIZE = 1000, 
        FIELDTERMINATOR = '|', 
        ROWTERMINATOR = '\n', 
        FIRSTROW = 2,
        ERRORFILE='\\spath\users.err'
    )
GO

15 текстовых файлов различаются по размеру. Некоторые из них имеют менее 5000 строк, а самые большие - более 5000000 строк. Я запускаю сценарий на сервере с 12 ГБ памяти и файлом подкачки размером 24 ГБ. После запуска я замечаю, что использование физической памяти на этом сервере неуклонно увеличивается, пока не приблизится к 100%. Даже после завершения сценария (или сбоя из-за нехватки памяти) использование памяти никогда не падает. Кажется, что Sql Server никогда не освобождает ресурсы памяти, которые он использует для выполнения массовых вставок.

Кто-нибудь знает, могу ли я решить эту проблему, изменив свой сценарий, или это проблема с SQL Server?

Редактировать: В конце концов я получаю сообщение об ошибке «Недостаточно системной памяти во внутреннем пуле ресурсов для выполнения этого запроса». и после этого все терпит неудачу.

Это по замыслу. Если вы не ограничите объем памяти, который SQL Server может иметь к нему доступ, он потребует столько памяти, сколько может. Обычно это неплохо. У SQL есть собственная внутренняя ОС для таких вещей, как пул потоков и управление памятью, и он ОЧЕНЬ хорош в этих вещах. Добавление такого количества данных, скорее всего, приведет к тому, что SQL будет помещать много данных в свой кеш данных (среди прочего), который хранится в памяти.

Если SQL Server - единственное, что работает на вашем компьютере, то общее правило состоит в том, чтобы позволить ему иметь всю память, кроме 1,5 / 2 ГБ, зарезервировав ее для ОС сервера. Чем больше памяти вы можете использовать для SQL Server, тем счастливее он будет.

ИЗМЕНИТЬ в сторону вашего редактирования:
Вы определенно захотите ограничить объем памяти, который будет использовать SQL Server. Я не могу точно сказать, с каким количеством байтов вы работаете, но вы, вероятно, заставляете свой сервер менять SQL, что является плохой новостью.

В обозревателе объектов в SQL Server Managment Studio:

  • Щелкните правой кнопкой мыши экземпляр вашего сервера
  • Нажмите на Память в списке навигации слева.
  • Установите Максимальный объем памяти сервера (в МБ) в диапазоне от 10000 до 15000 (10-15 ГБ).
  • Нажмите ОК

Или вы также можете запустить это в окне запроса:

sp_configure 'max server memory (MB)',10000
GO
RECONFIGURE
GO

10000 ограничивает память SQL на уровне 10 ГБ.