Я использую веб-приложение Visual Studio, используя ASP.NET MVC & C #. У меня есть файл Excel из более чем 100000 записей для импорта в SQL Server 2008 R2.
Я использовал SqlBulkCopy
с ado.net DataTable
для копирования данных в таблицу ( Table1
).
Затем проверка и обработка данных и маркировка действительны / недействительны.
Затем добавление и обновление записей в таблицах 3 ( Table2
2 , Table3
и Table4
) из Table1
с помощью хранимой процедуры.
Table4
содержит 2 триггера и использует курсор для обновления нескольких записей, связанных с ним в Table4
и другой таблице ( Table2
).
При тестировании он принимает 1 минуту для 10000 записей с моей локальной машины в режиме отладки.
Если 10 или 100 пользователей будут импортированы в одно и то же время, поддержит ли это?
Есть ли улучшенный процесс для улучшения и поддержки для многих одновременных пользователей?
Конфигурация моего компьютера:
ОЗУ 8 ГБ
Файл Excel содержит 50 столбцов
Когда я тестирую его с 5 одновременными пользователями, процесс 2 или 3 успешно выполняется, и я получаю эту ошибку:
Транзакция (идентификатор процесса 66) была заблокирована в режиме блокировки | коммуникационные буферные ресурсы с другим процессом и был выбран в качестве жертвы взаимоблокировки. Перезапустите транзакцию.
Можете ли вы отключить (или, возможно, отбросить и пересоздать позже) индексы во время импорта? Индексы фиксируют выбор, но замедляют Вставка и обновление для больших таблиц? Используйте MERGE вместо INSERT и UPDATE.
Найдите альтернативу для курсора (например, CTE или while loop или MERGE statement) или используйте курсор FAST_FORWARD, если он еще не используется.
Как вы проверяете данные. Этот шаг достаточно быстро?
Вам нужны триггеры во время массовой обработки. Используются ли эти таблицы где-то. Код триггера, который будет выполняться в каждой строке, вы можете выполнить это в пакетном режиме массового импорта. Существует опция отключения триггеров в Sql. Проверьте, подходит ли это для вашей цели.
Пакеты SSIS также могут импортировать данные и делать такие вещи.
Вы можете создать table2_temp, table3_temp, table4_temp (может быть для каждого пользователя динамически и опустить их позже). Делайте свою обработку отдельно и MERGE в основной таблице2, table3, table4, если триггеры в таблице 4 не работают с ранее существовавшими данными.