Обновить большое количество записей за раз сложно – это долгий процесс, который может вызвать не желательные блокировки и снижение скорости работы базы данных. Чтобы этого избежать, можно разбить обновление данных, например так: (код подходит для MS SQL 2005 и более старших версий)
DECLARE @RowsUpdated INTEGER SET @RowsUpdated = 1 WHILE (@RowsDeleted > 0) BEGIN UPDATE TOP (1000) TableName SET SomeField = '' WHERE OtherField = SomeValue AND SomeField != '' SET @RowsUpdated = @@ROWCOUNT END
Данный код обновляет в цикле по 1000 строк
Если вам нужно удалить строки, то это делается аналогично и описано в этой статье на нашем сайте
@@ROWCOUNT возвращает количество строк затронутых последней операцией, в данном случае обновлением. Как только строки перестанут удаляться, цикл завершится. Это значение нужно сохранять непосредственно после выполнения команды, иначе значение может измениться.
После обновления необходимо выполнить сжатие базы данных для уплотнения и очистки от мусора.
DBCC SHRINKDATABASE(N'Database')
Так как вследствии уплотнения индексы могут фрагментироваться, то рекомендуется выполнить дефрагментацию индексов. Как это сделать описано в статье о дефрагментации индексов
Внимание! Не выполняйте код бездумно на боевой системе не опробовав его на тесте. Автор статьи не несёт ответственности за последствия.