これがなぜなのか、またはそれを高速化できる方法を探しています。
基本的に、このようなコードでオブジェクトを構築します
(疑似コード)
Person p = new Person();
Address a = new Address() { ... properties set here ... };
Employer e = new Employer() { ... properties set here ... };
// etc.
p.Employer = e;
p.Address = a;
//etc.
そして最後に:
_context.Person.Add(p);
コードをプロファイリングすると、人物の構築には 0 ミリ秒かかり、非常に高速です。ただし、人物をコンテキストに追加すると、約 1500ms かかります。制約チェックと関係があるのでしょうか? データベースはメモリなどにロードされていませんが、非常に大きいため、その時点でAdd
データベースに触れてはいけません。
私がそうするときだけ、_context.SaveChanges()
それは書かれるべきです。
速度を改善するための提案はありますか?
編集: ベンチマークは次のように行われます: (sw はnew Stopwatch()
)
sw.Restart();
context.Person.Add(p);
Console.WriteLine("Person added to context: " + sw.ElapsedMilliseconds + "ms");
編集 2: プロットが厚くなります。
膨大な数の人を読み込んでデータベースに追加しているので、最初に行う操作の 1 つは、その人がデータベースに既に存在するかどうかを確認することです。速度上の理由から、Person.PersonId の完全なリストをハッシュテーブルに取り込み、挿入するレコードごとにチェックします。
その人がリストに既に存在する場合は、データベースから引き出します。これには約 5 ミリ秒かかりますが、データに対して何もせず (その部分はまだ書いていないため)、次の部分にスキップします。
ただし、コンテキストに追加されている新しいエントリに到達すると、その行が大幅な速度低下を引き起こします。コードは次のとおりです。
matchPerson = _context.Person.SingleOrDefault(c => c.PersonId == intPersonId);
そのため、0ms のハッシュテーブル チェック (即時) を介して、既にその人物がデータベースに存在する場合は、その人物をデータベースから引き出します。
それには約 5 ミリ秒かかります。
_context.Add
この行が存在するときに上記を実行すると、非常に遅くなります。コメントアウトすると、約 40 ミリ秒かかり、レコードが追加されるたびに増加します (したがって、2,000 レコードの後では約 200 ミリ秒かかります)。
2 つの行の間にはリンクが見られないので、コンテキスト クエリによってコンテキストの状態がリセットされ、次の操作が遅くなる可能性があります。