Дано:
- СУБД MS SQL Server
- Регистр сведений ~80 млн записей
Задача:
- удалить ~70 млн записей регистра сведений
- удалить по условию
Решение:
Если бы мне необходимо было удалить все записи, я бы воспользовался следующей командой
USE <ИмяБазы>
truncate table <ИмяТаблицы>
*имя таблицы можно посмотреть с помощью обрабтки //infostart.ru/public/16282/
Но мне надо было удалить записи по условию, казалось бы, что может быть проще, пишем:
USE <ИмяБазы>
delete from <ИмяТаблицы> where <ИмяПоля> = <ЗначениеПоля>
Но, даже в простой (Simple) модели восстановления, все операции изменения данных пишутся в одной транзакции. Соответственно лог транзакций растет очень сильно, в моем случае мне просто не хватило места на диске.
Оптимальное решение - удалять записи порциями, напимер по 5000.
USE <ИмяБазы>
WHILE 1=1
BEGIN
DELETE top (5000) FROM <ИмяТаблицы>
where <ИмяПоля>= <ЗначениеПоля>;
if @@ROWCOUNT<1 break;
END
ROWCOUNT - Возвращает число строк, затронутых при выполнении последней инструкции. Если число строк превышает 2 миллиарда, используйте ROWCOUNT_BIG
Надеюсь, мой пост будет кому-то полезен.
Гуру SQL, снимайте кеды, прежде чем пинаться! :)