Моя цель - максимизировать производительность. Основы сценария:
- Я считал некоторые данные из SQL Server 2005 в таблицу данных (1000 записей x 10 столбцов)
- Я выполняю некоторую обработку в .NET данных, все записи имеют как минимум 1 поле, измененное в DataTable, но потенциально все 10 полей могут быть изменены
- Я также добавляю несколько новых записей в таблицу данных
- Я делаю SqlDataAdapter.Update (myDataTable.GetChanges ()), чтобы сохранить обновления (вставки) обратно в БД, используя InsertCommand и UpdateCommand, которые я определил в начале
- Предположим, что обновляемая таблица содержит 10 миллионов записей
Это хорошо. Однако, если строка в DataTable изменилась, тогда ВСЕ столбцы для этой записи обновляются в базе данных, даже если только 1 из 9 столбцов фактически изменил значение. Это означает ненужную работу, особенно если задействованы индексы. Я не верю, что SQL Server оптимизирует этот сценарий?
Я думаю, что если бы мне удалось обновить только столбцы, которые фактически изменились для любой данной записи, я бы увидел заметное улучшение производительности (особенно в совокупности, я буду иметь дело с миллионами строк).
Я нашел эту статью: http://netcode.ru/dotnet/?lang=&katID=30&skatID=253&artID=6635
Но не нравится идея сделать несколько обновлений внутри sproc.
Если не считать создания отдельных операторов UPDATE для каждого измененного DataRow, а затем запускать их каким-то образом в пакете, я ищу опыт / предложения других людей.
(Пожалуйста, предположите, что я не могу использовать триггеры)
Заранее спасибо
Редактировать: Любой способ получить SqlDataAdapter для отправки операторов UPDATE, специфичных для каждого измененного DataRow (только для обновления фактических измененных столбцов в этой строке), вместо предоставления общего .UpdateCommand, который обновляет все столбцы?