Иногда возникают задачи, когда необходимо удалить из таблицы большое количество строк (миллионы, десятки миллионов). При удалении возникают блокировки таблицы, идет запись в транзакшн лог и если подходить к решению данной задачи по простому, то окончания операции можно не дождаться (или через какое-то время получить сообщение об ошибке, в котором будет сказано, что закончилось свободное место на диске и лог писать больше некуда).
Если необходимо удалить бОльшую часть таблицы, то лучшим решением будет такое:
1. Создание новой таблицы с такой же структурой, но без индексов.
2. Копирование из исходной в новую только тех строк, которые должны остаться в исходной.
3. Создание всех необходимых индексов.
4. Удаление исходной таблицы и переименование новой.
Если же все таки по каким то причинам нужно именно удалять записи, то рекомендуется это делать небольшими порциями:
SET ROWCOUNT 5000
WHILE @@ROWCOUNT <> 0
DELETE TableName
WHERE DateForDel >= '20000101'
AND DateForDel <= '20120101'
SET ROWCOUNT 0
Если необходимо удалить бОльшую часть таблицы, то лучшим решением будет такое:
1. Создание новой таблицы с такой же структурой, но без индексов.
2. Копирование из исходной в новую только тех строк, которые должны остаться в исходной.
3. Создание всех необходимых индексов.
4. Удаление исходной таблицы и переименование новой.
Если же все таки по каким то причинам нужно именно удалять записи, то рекомендуется это делать небольшими порциями:
SET ROWCOUNT 5000
WHILE @@ROWCOUNT <> 0
DELETE TableName
WHERE DateForDel >= '20000101'
AND DateForDel <= '20120101'
SET ROWCOUNT 0
Привет !
ОтветитьУдалитьВариация на тему удаления порциями:
WHILE @@ROWCOUNT <> 0
DELETE TOP(5000) SomeTable
WHERE Date BETWEEN @DateBegin AND @DateEnd
В выражение TOP() можно подставить переменную.
Работает во всех версиях MSSQL Server, начиная с 2005.
Спасибо, хороший вариант
Удалить