После прочтения this article Я решил более внимательно посмотреть на то, как я использовал Dapper.Насыпные вкладыши занимают больше времени, чем ожидалось, с использованием Dapper
Я побежал этот код на пустой базе данных
var members = new List<Member>();
for (int i = 0; i < 50000; i++)
{
members.Add(new Member()
{
Username = i.toString(),
IsActive = true
});
}
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
потребовалось около 20 секунд. Это 2500 вставок в секунду. Неплохо, но неважно, что в блоге было 45k вставок в секунду. Есть ли более эффективный способ сделать это в Dapper?
Кроме того, в качестве дополнительной заметки, запуск этого кода через отладчик Visual Studio занял более 3 минут! Я решил, что отладчик немного замедлит его, но я был очень удивлен, увидев это.
UPDATE
Так что
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
и это
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
и потребовалось 20 секунд.
Но это заняло 4 секунды!
SqlTransaction trans = connection.BeginTransaction();
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);
trans.Commit();
Вы пробовали DbTransaction (SqlTransaction)? Это немного меньше накладных расходов. Кроме того, просто для чисел: возможно, попробуйте и без транзакции, поэтому мы знаем, что мы измеряем. Наконец, что же происходит в 20-е годы? Вставки? Вставки + завершены? Все? Что-то другое? –
20s - это только часть, охватываемая оператором using. Я попробую SqlTransaction – kenwarner
. Другой тип транзакции не может сэкономить больше нескольких миллисекунд. Это разовая стоимость, не пропорциональная количеству предметов. – usr