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