Исключение нехватки памяти в 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 строка". В качестве альтернативы, есть ли способ записать ваши операторы обновления как одно утверждение, чтобы вы не делали константу назад и вперед от сервера и клиента?