使用Dapper,批量插入的时间比预期的要长

dapper performance sqlbulkcopy

阅读本文后,我决定仔细研究一下我使用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();

一般承认的答案

使用这种方法,我能够在4秒内获得的最佳记录是50k

SqlTransaction trans = connection.BeginTransaction();

connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);

trans.Commit();

专家解答

仅使用一个insert语句的Execute方法永远不会进行批量插入或高效。即使是Transaction中接受的答案也不会进行Bulk Insert

如果要执行Bulk Insert ,请使用SqlBulkCopy https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy

你找不到比这更快的东西。

Dapper Plus

免责声明 :我是Dapper Plus项目的所有者

该项目不是免费的,但提供所有批量操作:

  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

(在引擎盖下使用SqlBulkCopy

还有一些选项,比如输出身份值:

// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
                 .Table("Orders")
                 .Identity(x => x.ID);

// CHAIN & SAVE entity
connection.BulkInsert(orders)
          .AlsoInsert(order => order.Items);
          .Include(x => x.ThenMerge(order => order.Invoice)
                         .AlsoMerge(invoice => invoice.Items))
          .AlsoMerge(x => x.ShippingAddress);   

我们的库支持多个提供者:

  • SQL Server
  • SQL Compact
  • 神谕
  • MySQL的
  • PostgreSQL的
  • SQLite的
  • 火鸟



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因