Следующий код позволит удалить большое количество записей с минимальными блокировками. Код подходит для MS SQL 2005 и более старших версий.
DECLARE @RowsDeleted INTEGER SET @RowsDeleted = 1 WHILE (@RowsDeleted > 0) BEGIN DELETE TOP (10000) FROM TableName WHERE id < 4295200 SET @RowsDeleted = @@ROWCOUNT END
Данный код в цикле удаляет по 10000 строк
@@ROWCOUNT возвращает количество строк затронутых последней операцией, в данном случае удалением. Как только строки удаляться перестанут, цикл завершится. Это значение нужно сохранять непосредственно после выполнения команды, иначе значение может измениться.
После удаления необходимо выполнить сжатие базы данных для уплотнения и очистки от мусора.
DBCC SHRINKDATABASE(N'Database')
Так как вследствии уплотнения индексы могут фрагментироваться, то рекомендуется выполнить дефрагментацию индексов. Как это сделать описано в статье о дефрагментации индексов
Внимание! Не выполняйте код бездумно на боевой системе не опробовав его на тесте. Автор статьи не несёт ответственности за последствия.