Похоже, что между вашим SQL-сервером и сервером приложений существует большая задержка. Когда я делаю это локально, чистая версия TSQL выполняется за 363 мс, а версия C # с 2000 обходами занимает 1061 мс (так: около 0,53 мс за прием). Примечание: я забрал Console.WriteLine
, потому что не хотел измерять, насколько быстро Console
нет!
Для 2000 вставок это довольно справедливое сравнение. Если вы видите что-то совершенно другое, то я подозреваю:
- ваш SQL-сервер ужасно недостаточно загружен - ему не нужно 15 секунд (из вопроса), чтобы вставить 2000 строк при любых обстоятельствах (время 363 мс на моем рабочем столе ПК, а не быстрый сервер)
- как уже предлагалось; у вас высокая задержка
Обратите внимание, что есть также такие вещи, как "DTC", которые могут повлиять на производительность, основанную на строке подключения и окружающих транзакциях (TransactionScope
), но я предполагаю, что это не факторы здесь.
Если вам нужно улучшить производительность здесь, первое, что нужно сделать, это выяснить , почему это так ужасно - то есть производительность необработанного сервера ужасна , и задержка огромна . Ни один из них не является вопросом кодирования: это вопросы инфраструктуры.
Если вы не можете это исправить, вы можете написать код вокруг них. Табличные значения параметров или массовая вставка (SqlBulkCopy
) предоставляют способы переноса нескольких строк без необходимости оплачивать туда-обратно за выполнение. Вы также можете использовать «MARS» (несколько активных наборов результатов) и конвейерные вставки, но это довольно сложная тема (и большинство людей, как правило, рекомендуют не включать MARS).