Как увеличить скорость вставки, используя групповую вставку, используя AddRange, а затем SaveChanges в Entity Framework - PullRequest
0 голосов
/ 29 января 2019

Я использовал Entity Framework для вставки данных в таблицы SQL.

Для большего количества записей вместо Add() я использовал AddRange() и вызывал SaveChanges() позже.

Вставка записей по-прежнему занимает слишком много времени - есть ли какие-нибудь решения для увеличения скорости?

_Repository.InsertMultiple(deviceDataList);

await _Repository.SaveAsync();

public void InsertMultiple(List<string> deviceDataList)
{
    context.Devices.AddRange(devices);
}

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Использование AddRange поверх Add - это уже большое улучшение.Он исправляет медленную часть приложения.

Тем не менее, SaveChanges все еще занимает много времени, потому что для каждой сохраняемой сущности выполняется одно обращение к базе данных.Таким образом, если у вас есть 10 000 сущностей для вставки, будет выполнено 10 000 обращений к базе данных, что БЕЗУМНО медленно.


Отказ от ответственности : я владелециз Расширения Entity Framework

Эта библиотека не является бесплатной, но позволяет выполнять все массовые операции, включая BulkSaveChanges и BulkInsert:

  • Массовое SaveChanges
  • Массовая вставка
  • Массовое удаление
  • Массовое обновление
  • Массовое слияние

Пример

// Easy to use
context.BulkSaveChanges();

// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);

// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);

// Customize Bulk Operations
context.BulkInsert(customers, options => {
   options => options.IncludeGraph = true;
});
context.BulkMerge(customers, options => {
   options.ColumnPrimaryKeyExpression = 
        customer => customer.Code;
});
0 голосов
/ 29 января 2019

Неважно, используете ли вы Add в foreach или AddRange, проблема заключается в методе SaveChanges, так как я думаю, что он сохраняет изменения в наблюдаемых объектах один за другим.Существуют библиотеки, которые позволяют выполнять настоящую массовую вставку сущностей, используя механизм SqlBulkCopy

Ссылка на библиотеку EF Core: EFCore.BulkExtensions

РЕДАКТИРОВАТЬ: Для EF6 я нашел этот nuget: EntityFramework6.BulkInsert но я лично не использовал его, поэтому я ничего не могу сказать об этом.

EDIT 2: я упростилэто, используя AddRange поверх Add, улучшит время добавления сущностей для изменения трекера, но все же SaveChanges может занять очень много времени, поэтому это не решение.

...