Это относится к проекту, который я унаследовал, и не может изменить структуру таблицы или модель доступа к данным. Меня попросили оптимизировать алгоритм, используемый для вставки данных в базу данных.
У нас есть набор данных в таблице T. Из этого мы извлекаем набор, который мы назовем A. Мы также запрашиваем XML-канал и получаем набор мы вызовем X.
Все эти изменения необходимо вставить обратно в базу данных.
Установленный алгоритм делает следующее:
Query XML into a LIST
foreach over the XML LIST
look up foreach.item in A via LINQ (i.e. query = from record in A where
record.GUID == foreach.item.GUID
select record)
if query.Count() == 0
insert into A (via context.AddToTableName(newTableNameObject)
else
var currentRecord = query.First()
set all properties on currentRecord = properties from foreach.item
context.SaveChanges()
Я знаю, что это неоптимально. Я попытался поместить A в объект (назовите его queryA) вне цикла foreach, пытаясь переместить запрос в память, не касаясь диска, но, подумав над этим, я понял, что база данных уже находится в памяти.
После добавления объектов таймера в алгоритм становится ясно, что больше всего времени уходит на вызов функции SaveChanges (). В некоторых случаях это 20 мс, а в некоторых других, очевидно, оно перескакивает до 100 мс.
Я бы предпочел вызывать SaveChanges () только один раз. Я могу' Я выяснил, как это сделать, учитывая мои глубокие знания EF (которые в лучшем случае тонкие) и ограничения, связанные с невозможностью изменять структуры таблиц и необходимостью сохранять данные из A, которых нет в X.
Предложения ?