1. ホーム
  2. performance

Dapperを使用したバルクインサートの時間が予想より長い

2023-09-21 15:43:20

質問

読後感 この記事 を読んで、自分の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();