Исключение нехватки памяти в SQL Server 2012

Я пытаюсь выполнить большой скрипт SQL, который содержит около 1000000 простых UPDATEзапросы.

Общий размер этого файла сценария составляет около 100 МБ.

Когда я запускаю этот скрипт, я получаю исключение Out Of Memory.

Когда я разделяю файл на 10 МБ, я могу запустить каждый из них.

Однако мне для удобства хотелось бы, чтобы за один раз можно было запустить только один скрипт. Есть ли какое-либо утверждение, которое я могу представить, чтобы SQL-сервер высвобождал выделенную память после выполнения каждого запроса, чтобы я мог выполнить этот большой скрипт сразу?

3 ответа

Решение

Если вы еще этого не сделали, вставьте GO каждая тысяча заявлений или около того. В противном случае весь файл будет одной большой партией. SQL Server рассчитывает один план выполнения для пакета, который может подтолкнуть вас к ограничению ресурсов.

Вы можете столкнуться с другим типом проблемы с ресурсами, если вы запустите весь файл в той же транзакции. Чем больше транзакция, тем больше дискового пространства понадобится вашему файлу журнала TX для завершения обработки вашего файла.

ОБНОВЛЕНО: Откройте окно командной строки (run+cmd) и выполните следующее:

sqlcmd -S YOURSQLSERVER\INSTANCENAME -i c:\your_script_file.sql -o c:\your_log_file.log

Я заметил, что в SSMS 2012 возникает утечка памяти, связанная с окном результатов. Попробуйте положить set nocount on вверху вашего скрипта, чтобы предотвратить заполнение панели результатов сообщениями "затронуты 1 строка". В качестве альтернативы, есть ли способ записать ваши операторы обновления как одно утверждение, чтобы вы не делали константу назад и вперед от сервера и клиента?

Другие вопросы по тегам