массовое удаление - каскадное удаление производительности убийца? - PullRequest
0 голосов
/ 12 апреля 2011

В моей базе данных SQL Server 2008R2 много больших связанных таблиц:

  • Мастер
  • подробно-1
  • подробно-2
  • подробно-2-A

все внешние ключи являются каскадными:

  • master -> detail1
  • master -> detail2
  • detail2-> detail-2-A

Поэтому, когда я удаляю запись из мастера, следуют все связанные детали. Удаление занимает очень много времени. Например. один мастер может иметь 1,2 миллиона записей в деталях2 и 60 миллионов записей в деталях2A.

Было бы более эффективно создать хранимую процедуру, которая удаляет сначала деталь2А, а затем деталь2 и т. Д. Или есть лучший подход.

БД не разделена.

1 Ответ

1 голос
/ 12 апреля 2011

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

Или вы можете обрабатывать партиями. Переместите все значения идентификаторов, которые вы хотите добавить в промежуточную таблицу, а затем удалите их 1000 (или 20000 или 200, фактическое число может быть определено системой только по соображениям производительности.) За один раз и последовательно, пока все записи не будут удалены , Возможно, вы захотите поэкспериментировать с удалением записей по одной таблице за раз, а не каскадом.

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

При каскадном удалении нужно учитывать одно: действительно ли вы хотите удалить запись, если существуют дочерние записи? Внешние ключи существуют, отчасти, чтобы помешать вам сделать это, и каскадное удаление отменяет это поведение. Поэтому, если ваши дочерние записи представляют собой что-то вроде заказов, ни при каких обстоятельствах вы не хотите удалять их автоматически при каскадном удалении, иначе вы потеряете необходимую финансовую информацию, даже если клиент больше не активен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...