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