Как ускорить удаление из большой таблицы базы данных?

Вот проблема, которую я пытаюсь решить: я недавно выполнил редизайн слоя данных, который позволяет мне распределять нагрузку на мою базу данных по нескольким частям. Чтобы сбалансировать сегменты, мне нужно иметь возможность переносить данные из одного сегмента в другой, что включает копирование из сегмента A в сегмент B, а затем удаление записей из сегмента A. Но у меня есть несколько очень больших таблиц, и на них указывают многие внешние ключи, поэтому удаление одной записи из таблицы может занять более одной секунды.

В некоторых случаях мне нужно удалить миллионы записей из таблиц, и это занимает слишком много времени, чтобы быть практичным.

Отключение внешних ключей не вариант. Удаление больших пакетов строк также невозможно, поскольку это производственное приложение, а большие удаляют блокировку слишком большого количества ресурсов, что приводит к сбоям. Я использую Sql Server и знаю о секционированных таблицах, но ограничения на секционирование (и лицензионные сборы для корпоративной версии) настолько нереальны, что они невозможны.

Когда я начал работать над этой проблемой, я подумал, что самой сложной задачей будет написание алгоритма, который выясняет, как удалять строки с уровня листа до вершины модели данных, чтобы на этом пути не нарушались ограничения внешнего ключа. Но решение этой проблемы не принесло мне пользы, поскольку на удаление записей, которые должны исчезнуть в одночасье, уходят недели.

Я уже создал способ пометить данные как фактически удаленные, так что в отношении приложения данные исчезли, но я все еще имею дело с большими файлами данных, большими резервными копиями и более медленными запросами из-за огромного размера столы.

Есть идеи? Я уже прочитал старые посты и не нашел ничего, что могло бы помочь.

Ответы на вопрос(7)

Ваш ответ на вопрос