2

これがなぜなのか、またはそれを高速化できる方法を探しています。

基本的に、このようなコードでオブジェクトを構築します

(疑似コード)

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 つの行の間にはリンクが見られないので、コンテキスト クエリによってコンテキストの状態がリセットされ、次の操作が遅くなる可能性があります。

4

1 に答える 1