У нас есть фрагмент кода, который выполняет массовую вставку с использованием библиотеки lib EntityFramework.BulkInsert-ef6-ext .Мы сталкиваемся с некоторыми проблемами производительности: весь процесс выполнения работы + вставка данных занимает около 150 мс .Это похоже на то, как это было на моей машине разработчика, где только я работаю.Я предполагаю, что на нашем производственном сервере этот процесс намного медленнее, поскольку на нем много трафика.
Мое первое предположение состояло в том, что массовая вставка выполняется медленнее, чем одиночные вставки, когда имеется только несколько датаров.
Я установил небольшое тестовое приложение, которое отслеживает время во время вставки.Вот мои результаты для 1 строки:
Профилировщик:
- объем: процессор (31), чтение (1809), продолжительность (29)
- single: cpu (0), reads (13), duration (1)
Но, глядя на прослеженное время в моем коде c #, мы видим совершенно другую картину:
объем: 85мс
single: 130мс
Теперь возникает два вопроса:
- Почему при вставке с EF так много накладных расходов?Как это можно уменьшить?
- Есть ли возможность ускорить одиночные вставки с 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;
}
С уважением, Йозеф