Вставка с Entity Framework очень медленно - PullRequest
0 голосов
/ 18 мая 2018

У нас есть фрагмент кода, который выполняет массовую вставку с использованием библиотеки lib EntityFramework.BulkInsert-ef6-ext .Мы сталкиваемся с некоторыми проблемами производительности: весь процесс выполнения работы + вставка данных занимает около 150 мс .Это похоже на то, как это было на моей машине разработчика, где только я работаю.Я предполагаю, что на нашем производственном сервере этот процесс намного медленнее, поскольку на нем много трафика.

Мое первое предположение состояло в том, что массовая вставка выполняется медленнее, чем одиночные вставки, когда имеется только несколько датаров.

Я установил небольшое тестовое приложение, которое отслеживает время во время вставки.Вот мои результаты для 1 строки:

Профилировщик:

  1. объем: процессор (31), чтение (1809), продолжительность (29)
  2. single: cpu (0), reads (13), duration (1)

Но, глядя на прослеженное время в моем коде c #, мы видим совершенно другую картину:

объем: 85мс

single: 130мс

Теперь возникает два вопроса:

  1. Почему при вставке с EF так много накладных расходов?Как это можно уменьшить?
  2. Есть ли возможность ускорить одиночные вставки с EF?

Наконец, вот мой тестовый код:

static void Main(string[] args)
{
    var sw = new Stopwatch();
    long t1, t2 = 0;

    using (var ctx = new TestContext())
    {
        var list = new List<Customer>();

        for (int i = 0; i < 1; i++)
        {
            list.Add(new Customer());
        }

        sw.Start();
        ctx.BulkInsert(list);
        ctx.SaveChanges();
    }

    sw.Stop();
    t1 = sw.ElapsedMilliseconds;

    sw.Reset();

    using (var ctx = new TestContext())
    {
        var trx = new TransactionScope();
        ctx.Configuration.LazyLoadingEnabled = false;
        ctx.Configuration.AutoDetectChangesEnabled = false;
        ctx.Configuration.ValidateOnSaveEnabled = false;
        var list = new List<Customer>();

        for (int i = 0; i < 1; i++)
        {
            ctx.Customer.Add(new Customer());
        }

        sw.Start();
        ctx.SaveChanges();
        trx.Complete();
        trx.Dispose();
    }

    sw.Stop();
    t2 = sw.ElapsedMilliseconds;
}

С уважением, Йозеф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...