Удалить много строк, пока таблица используется

Удаление строк в базе данных — очень затратная процедура, если вы хотите удалить их много.

Я попытался запустить пакетное удаление с помощью CHECKPOINT на 50000 строк (занимает 3-10 секунд) в таблице с 20 миллионами строк, удалив примерно половину из них, пока таблица используется. Пока он делал свою работу, он замедлял доступ к базе данных до обхода, вся система перестала своевременно реагировать.

Что я могу сделать, периодически удаляя старый хлам, не слишком замедляя работу системы?

Упомянутая таблица имеет очень длинные строки (сотни столбцов), упорядоченные по времени (самые новые обновляются/вставляются), мы часто выбираем самые новые, но удаляем самые старые.


person mrówa    schedule 24.08.2016    source источник
comment
Что замедляет базу данных? Это блокировка на столе, это ваша проблема? Ваш MAXDOP установлен на ноль, поэтому вы получаете конкуренцию за тактовое время процессора? У вас есть куча триггеров, которые срабатывают, когда вы удаляете данные?   -  person Rich Benner    schedule 24.08.2016
comment
если большая часть таблицы удалена, почему нельзя использовать select into newtable required records и удалить старую таблицу   -  person TheGameiswar    schedule 24.08.2016
comment
@RichBenner, похоже, насыщен ввод-вывод, а не ЦП. MAXDOP равен 0, пользовательские триггеры отсутствуют.   -  person mrówa    schedule 24.08.2016
comment
@TheGameiswar спасибо, это звучит как хорошая идея, я проверю.   -  person mrówa    schedule 24.08.2016


Ответы (1)


Копирование отфильтрованных строк во временные таблицы, усечение таблицы и вставка в только что усеченную таблицу работает намного лучше.

person mrówa    schedule 29.09.2016