Каскад на производительность удаления: Какой самый быстрый способ удалить строку из 1-много строк? - PullRequest
2 голосов
/ 16 сентября 2009

У меня есть база данных, в которой есть родительская строка «Учетная запись», которая затем имеет отношение 1-Много с другой таблицей, и эта таблица имеет отношение 1-Много с другой таблицей. Это происходит примерно на 6 уровнях (с учетной записью вверху). В самом низу могут быть тысячи (может даже превышать 100 тыс.) Строк. На каждой таблице есть внешний ключ, установленный каскадно при удалении.

Проблема в том, что, если я пытаюсь удалить самую верхнюю строку («Учетная запись»), это может занять минуты, иногда даже более 10 минут. Есть ли более быстрый способ удаления всех строк (например, может идти снизу вверх в отдельных операторах удаления) или это в значительной степени каскад?

Я использую MSSQL 2005 & MSSQL 2008 для сервера и L2S для выполнения удаления, хотя я могу использовать оператор T-SQL, если он быстрее.

Я тоже пытался удалить из SQL Management Studio, и это занимает столько же времени.

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

Ответы [ 3 ]

4 голосов
/ 16 сентября 2009

Удаление - это удаление, и если вы хотите удалить огромное количество строк (100 КБ), это займет некоторое время.

Если вы выполняете мягкое удаление (например, устанавливаете состояние «D»), вы можете запустить задание, чтобы фактически удалить строки, скажем, 1000 или около того, со временем это может работать лучше для вас. Мягкое удаление должно обновлять только строку заголовка и будет очень быстрым. Вы должны были бы закодировать свое приложение, чтобы игнорировать эти строки статуса "D" и их потомков.

EDIT Для дальнейшего комментария @ Кейн. Вы можете сделать только мягкое удаление, или вы можете сделать мягкое удаление с последующим пакетным процессом, чтобы выполнить фактическое удаление, если вы действительно этого хотите. Я бы просто остановился на программном удалении, если на диске нет проблем.

2 голосов
/ 16 сентября 2009

Вы проиндексировали все внешние ключи? Это общая проблема.

2 голосов
/ 16 сентября 2009

Похоже, у вас могут проблемы с индексированием.

Предполагается, что отношение родитель-ребенок в столбце ParentId. По определению столбец ParentId в родительской таблице должен иметь первичное или уникальное ограничение и, следовательно, быть проиндексирован. Дочернюю таблицу, однако, не нужно индексировать по ParentId. Когда вы удаляете родительскую запись, SQL должен удалить все строки в дочерней таблице, которым был назначен этот внешний ключ ... и если этот столбец не проиндексирован, работа должна быть выполнена с помощью сканирования таблицы. Это может произойти один раз для каждой таблицы в вашей «цепочке удаления».

Конечно, это может быть просто объем. Удаление нескольких k строк из 100k + баз данных с несколькими индексами, даже если индексированное поле «delete lookup» может занять значительное время - и не забывайте блокировать и блокировать, если у вас есть пользователи, обращающиеся к вашей системе во время удаления! 1007 *

Откладывать удаление до тех пор, пока окно обслуживания расписания, как предполагает KM, определенно будет вариантом, хотя для этого может потребоваться серьезное изменение базы кода.

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