Каталог решений - Очередная очистка таблиц средствами MS SQL

Очередная очистка таблиц средствами MS SQL

Очередная очистка таблиц средствами MS SQL

В наличии

Очередной пост про очистку таблицы средствами MS SQL. И почему стоит очищать большие таблицы порциями.

Категория:

Описание

Дано:

  • СУБД MS SQL Server
  • Регистр сведений ~80 млн записей

Задача:

  • удалить ~70 млн записей регистра сведений
  • удалить по условию

Решение: 

Если бы мне необходимо было удалить все записи, я бы воспользовался следующей командой

USE <ИмяБазы>
truncate table <ИмяТаблицы>

*имя таблицы можно посмотреть с помощью обрабтки //sale.itcity.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, снимайте кеды, прежде чем пинаться! 🙂

has been added to your cart:
Оформление заказа