Удаление большого набора данных из таблицы

Back

При организации хранилищ данных особое внимание стоит уделить  процессу обновления данных (частичному или полному). Чтобы обновить данные в таблице, необходимо удалить “устаревший” набор – с этим сталкивался, пожалуй, каждый разработчик хранилища данных. В этой статье рассмотрим оптимальный подход по удалению данных для таблиц фактов, а именно каким образом максимально быстро удалить устаревший набор данных.

Зачастую эту задачку решают стандартным способом:

delete from [dbo].[fct_tab]
where date_id between 20160201 and 20160215

Но на таблицах с десятками/сотнями миллионов строк, данный подход может занять большой промежуток времени. Также не стоит забывать, что инструкция DELETE по умолчанию всегда накладывает монопольную блокировку на строки целевой таблицы и держит до завершения транзакции.  Для оптимального решения необходимо придерживаться следующих правил:

  • Накладывать условие по полю кластерного индекса (не кластерный тоже подойдет) – наличие индекса позволяет быстро получить интересующий набор, при этом не перебирая все данные в таблице.
  • Удалять данные небольшими порциями. Использование выражения TOP в инструкции DELETE, не упорядочивает набор и как следствие не тормозит удаление.
  • В случае полной очистки таблицы – использовать инструкцию TRUNCATE.

Ну а теперь немного цифр. Проведем эксперименты на таблице со 100 000 000 записей, удалять будем 10 000 000:

1. Удалим часть данных из кучи:

Результат 35 сек.

2. Добавим кластерный индекс по полу отбора и удалим уже из индексированной таблицы:

Результат 22 сек.

3. Удалим порциями по 100 000 из индексированной таблицы:

Результат 14 сек.

Вывод:
На рассмотренном примере, применение техники порционного удаления из индексированной таблицы, дал прирост в производительности в 60% по сравнению с первоначальным способом.

Спасибо за проявленный интерес! Интересующие материалы придут вам на указанную почту в течение одного рабочего дня.

Поздравляем, ваша регистрация успешно пройдена!