Раз в 2–3 месяца клиент отправляет нам гигантский сценарий SQL для обновления своей веб-базы данных с учетом изменений. Сценарий завершается ошибкой при попытке запустить его через SQL Server Management Studio из-за нехватки памяти.
Запускаем запрос с помощью SQL Query Analyzer / Mgmt studio.
Сообщение об ошибке: Сервер: Msg 701, уровень
17, состояние 1, строка 64302
Недостаточно системной памяти для выполнения этого запроса
Та же проблема как в SQL 2000, так и в SQL 2005.
Сценарий содержит серию операторов DELETE и INSERT для нескольких таблиц.
Размер файла может достигать 57973 КБ.
В базе данных более 12000 объектов, не говоря уже о таблицах поиска и таблицах соединений. В таблице мультимедиа есть 65720 записей, а в другой таблице - 97799 записей.
У нас нет возможности изменить экспорт SQL, который мы получаем от клиента.
Это нехватка памяти на стороне сервера. Учитывая, что в ошибке упоминается Line 64302
Я предполагаю, что сценарий представляет собой единый пакет (без разделителей GO). Это могло объяснить проблему. Разделить полученный скрипт на несколько пакетов должно быть довольно просто, просто вставьте GO
где это уместно.
Здесь действительно нечего делать, кроме (а) увеличения доступной оперативной памяти или (б) уменьшения размера запроса. Если все это происходит внутри одной большой гигантской транзакции, вы действительно можете столкнуться с болью, особенно если изменяемые наборы данных большие (много столбцов, BLOB и т. Д.).
Это похоже на тот случай, когда вам нужно сесть со своим клиентом и обсудить альтернативы, чтобы сократить загружаемые наборы изменений - возможно, ежемесячное / еженедельное / ежедневное обновление вместо каждые 2-3 месяца?
Вы пробовали выполнить сценарий с помощью команды OSQL. Это должно устранить большую часть накладных расходов при использовании SSMS. Это, по крайней мере, изолирует, проблема ли это в базе данных или проблема в том, как SSMS обрабатывает запрос.
Просто мысль.