Удаление SQL занимает слишком много времени - PullRequest
3 голосов
/ 28 июля 2011

У нас есть таблица (скажем, T1), на которую ссылаются около 16 других таблиц с внешними ключами в нашей базе данных SQL Server. Доступ к данным осуществляется через приложение ASP.NET с LINQToSQL. Когда пользователь пытается удалить запись из T1, срок действия оператора истекает. Поэтому мы решили сначала удалить записи из таблиц, которые ссылаются на T1, и только затем удалить запись в T1. Проблема в том, что удаление из T1 не работает так быстро, как ожидалось.

У меня вопрос: нормально ли, чтобы удаление из таблицы, на которую ссылаются многие другие таблицы, занимало так много времени, даже если сама запись не имеет дочерних записей?

РЕДАКТИРОВАТЬ: очевидно, причиной тайм-аута было не само удаление, а другой запрос, который извлек данные из того же DataContext. Спасибо за ваши предложения, я отметил как ответ на предложение добавить индексы для всех внешних ключей, потому что это улучшило план выполнения нашего скрипта.

Ответы [ 3 ]

2 голосов
/ 28 июля 2011

Я подозреваю, что вам, возможно, придется изучить индексацию дочерних таблиц.

Звучит так, как будто для ваших FK выбрано Каскадное удаление, поэтому я подозреваю, что некоторые из ваших таблиц не имеют индекса, включающего ключ к родительскому элементу в качестве первого в индексе.

Таким образом, при удалении будут полностью проверены дочерние таблицы - даже если вы уже удалили дочерние записи, он все равно проверит, поскольку у вас все еще есть набор Каскад.

2 голосов
/ 28 июля 2011

Когда вы определяете отношение в БД, вы можете установить Delete rule как Cascade на SQL-сервере. Таким образом, когда вы удаляете запись из родительской таблицы, она будет автоматически удалена из дочерних таблиц.

Пожалуйста, смотрите изображение ниже:

enter image description here

Если это занимает много времени, возможно, вы установили другое ограничение, которое замедлит вниз процесс удаления.

1 голос
/ 28 июля 2011

Linq не выполняет массовое удаление, если вы используете его непосредственно для набора записей - вместо этого он, вероятно, удаляет одну запись за раз .

Чтобы повысить производительность, используйте хранимую процедуру вместо всех операций массовой вставки, обновления или удаления.

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