Вот проблема, которую я пытаюсь решить: я недавно выполнил редизайн слоя данных, который позволяет мне распределять нагрузку на мою базу данных по нескольким сегментам. Чтобы сбалансировать сегменты, мне нужно иметь возможность переносить данные из одного сегмента в другой, что включает копирование из сегмента A в сегмент B, а затем удаление записей из сегмента A. Но у меня есть несколько очень больших таблиц, и на них указано много внешних ключей, поэтому удаление одной записи из таблицы может занять более одной секунды.
В некоторых случаях мне нужно удалить миллионы записей из таблиц, и это занимает слишком много времени, чтобы быть практичным.
Отключение внешних ключей не вариант. Удаление больших пакетов строк также невозможно, поскольку это производственное приложение, а большие удаляют блокировку слишком большого количества ресурсов, что приводит к сбоям. Я использую Sql Server и знаю о секционированных таблицах, но ограничения на секционирование (и лицензионные сборы для корпоративной версии) настолько нереальны, что они невозможны.
Когда я начал работать над этой проблемой, я подумал, что трудной частью будет написание алгоритма, который выясняет, как удалять строки с уровня листа до вершины модели данных, чтобы не нарушать никаких ограничений внешнего ключа вдоль путь. Но решение этой проблемы не принесло мне пользы, поскольку на удаление записей, которые должны исчезнуть в одночасье, уходят недели.
Я уже создал способ пометить данные как фактически удаленные, так что в случае приложения данные исчезли, но я все еще имею дело с большими файлами данных, большими резервными копиями и более медленными запросами из-за абсолютный размер столов.
Есть идеи? Я уже прочитал старые посты и не нашел ничего, что могло бы помочь.