Я читаю и проверяю большие текстовые файлы фиксированной ширины (от 10 до 50 тысяч строк), которые отправляются через наш веб-сайт ASP.net (в кодировке VB.Net). Я делаю первоначальное сканирование файла, чтобы проверить основные проблемы (длина строки и т. Д.). Затем я импортирую каждую строку в таблицу MS SQL. Каждая строка БД в основном состоит из record_ID (первичное, автоинкрементное) и около 50 полей varchar.
После того, как вставка завершена, я запускаю функцию проверки файла, которая проверяет каждое поле в каждой строке на основе набора критериев (усеченная длина, числовая, проверка диапазона и т. Д.). Если он находит ошибку в каком-либо поле, он вставляет запись в таблицу «Ошибки», в которой есть error_ID, record_ID и сообщение об ошибке. Кроме того, если поле выходит из строя определенным образом, я должен сделать «сброс» в этом поле. Сброс может состоять из очистки всего поля или простой замены значения другим значением (например, замена строки новой, в которой удалены все нелегальные символы).
У меня есть тестовый файл на 5000 строк. Загрузка, первоначальная проверка и импорт занимает около 5-6 секунд. Подробная проверка ошибок и вставка в таблицу ошибок занимает около 5-8 секунд (в этом файле содержится около 1200 ошибок). Тем не менее, часть «Сброс» занимает около 40-45 секунд для 750 полей, которые необходимо сбросить. Когда я закомментирую функцию сброса (возврат немедленно без фактического вызова хранимого процесса UPDATE), процесс очень быстрый. После сброса настроек возврат страниц занимает 50 секунд.
Мой хранимый процесс UPDATE использует рекомендуемый код из http://sommarskog.se/dynamic_sql.html,, в результате чего вместо динамического SQL используется CASE:
UPDATE dbo.Records
SET dbo.Records.file_ID = CASE @field_name WHEN 'file_ID' THEN @field_value ELSE file_ID END,
.
. (all 50 varchar field CASE statements here)
.
WHERE dbo.Records.record_ID = @record_ID
Есть ли какой-нибудь способ помочь мне в этом выступлении. Можно ли как-то сгруппировать все эти вызовы UPDATE в одну транзакцию? Должен ли я каким-то образом переделывать запрос UPDATE? Или просто 750+ ОБНОВЛЕНИЙ и все просто медленно (это четырехъядерный сервер с 8 ГБ оперативной памяти).
Любые предложения приветствуются.