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分以上かかりました。私はデバッガが少し遅くするだろうと考えました、しかし私はそれほど見ることに本当に驚きました。

更新

したがって、この

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();

エキスパート回答

挿入ステートメントが1つのみのExecuteメソッドを使用しても、一括挿入はExecuteされません。 Transaction承認された回答であっても、 Bulk Insertは行いません。

Bulk Insertを実行する場合は、 SqlBulkCopy https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopyを使用します。

あなたはこれより速い何かを見つけることはありません。

Dapper Plus

免責事項 :私はDapper Plusプロジェクトのオーナーです

このプロジェクトは無料ではありませんが、すべての一括操作を提供しています:

  • BulkInsert
  • 一括更新
  • BulkDelete
  • バルクマージ

(フード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サーバー
  • SQLコンパクト
  • オラクル
  • MySql
  • PostgreSQL
  • SQLite
  • ファイアバード


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow