使用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合法嗎? 是的,了解原因