Основной проблемой здесь является то, что вы извлекаете все данные из базы данных, а затем построчно вставляете их обратно. Это не оптимально с точки зрения базы данных.Он отлично справляется с множествами, но вы рассматриваете множество как множество отдельных рядов.Таким образом, это становится медленным.
С точки зрения набора, у вас есть только два оператора, которые вам нужно выполнить:
- Вставьте строку
Forms
- Вставьте
Forms_ETypes
строк (как набор, а не по одному за раз)
1) должно быть то, что у вас сейчас:
insert into Forms([FormId]) values(@FormId)
2) должно быть что-то вроде:
insert Forms_ETypes([Form_Id],[EType_Id]) SELECT @FormId, Id from ETypes Where TypeOf IN ({0});
с использованием этой техники для передачи ваших form.TypeOf
значений.Обратите внимание, что предполагается, что у вас есть менее 500 записей в form.TypeOf
.Если у вас их много (например, больше 500), тогда лучше использовать UDT (обратите внимание, что некоторая информация о UDT предполагает, что вам нужно использовать сохраненный процесс, но не соответствует действительности.).
Это позволит вам выполнить только два оператора SQL - первый, а затем второй (возможно, тысячи с вашим текущим решением).
Это сохранитвремя по двум причинам:
- Механизму базы данных не нужно было дважды передавать данные по проводам (с сервера БД на ваше приложение и обратно).
- Выразрешил ядру базы данных выполнять операции на основе большого набора, а не множество операций меньшего размера (с задержкой из-за характера цикла запрос-ответ).