2017-04-18 9 views
1

私はPostgreSQLデータベースでエンティティ6を使用しています(Npgsqlコネクタを使用)。この設定のパフォーマンスが低いことを除いて、すべて正常に動作します。私はデータベース(約20kレコード)にあまりにも多くのオブジェクトを挿入しようとすると、必要以上に時間がかかります。 Entity Frameworkを初めて使用したので、私のローカルマシンのデータベースに20kのレコードを挿入するのに1分以上かかるのはむしろ混乱しました。エンティティ6 + PostgreSQL - ひどいパフォーマンス

インサートを最適化するために、私は見つけたすべてのチップを追跡しました。私はAutoDetectChangesEnabledをfalseに設定しようとしましたが、100または1000レコードごとにSaveChanges()を呼び出し、データベースコンテキストオブジェクトを再作成し、dbContext.Database.BeginTransaction()を呼び出して操作を終了するか、/1000レコード)。パフォーマンスを少しでも向上させるものはありません。

エンティティによって生成されたSQLクエリをログに記録することによって、私は何をしても、すべてのオブジェクトが別々に挿入され、すべての挿入に2〜4ミリ秒かかります。 DBコンテキスト・オブジェクトを再作成せずに、トランザクションを使用しないと、20,000を超える挿入の後にコミットが1つしかありません。トランザクションを使用していくつかのレコードをすべてコミットすると、より多くのコミットと新しいトランザクションの作成が行われます(DBコンテキストオブジェクトを再作成する場合と同じですが、接続が再確立された場合と同じです)。トランザクションを使用して少数のレコードごとにコミットすると、パフォーマンスの向上に気づくはずです。しかし、最終的には、複数のトランザクションを使用するかどうかにかかわらず、パフォーマンスに違いはありません。トランザクションがパフォーマンスを大幅に向上させることはないとは思いますが、少なくとも少しは助けてください。代わりに、すべてのインサートはローカルDB上で実行するのに少なくとも2msかかる。

ローカルマシン上のデータベースも重要ですが、リモートデータベースに20kオブジェクトを作成すると、1分よりもずっと多くなります。ログは、トランザクションがコミットされている状態で30ms(!) 100または1000レコードごとに再作成されます。一方、私が1つのインサートを手動で(ログからまっすぐに)実行すると、実行に1ms未満かかります。エンティティはトランザクションを使用してより多くの挿入物をまとめても、すべてのオブジェクトをデータベースに挿入するという甘い時間がかかるようです。私は実際にそれを得ることはありません...

私はそれを本当にスピードアップするために何ができますか?

+1

これ以上詳しく説明する人はいないかもしれませんが、EFは一括挿入用に設計されていません。 –

+0

EFはあなたの箱からあなたを助けることができません。 EFの上に一括挿入を実装するサードパーティのライブラリがあります。 –

+0

クライアントとDBサーバーの間のmsピングはどのようにして行われますか?また、接続プールソフトウェアを使用していますか? –

答えて

2

誰かが興味がある場合は、私の問題の解決策を見つけました。 Entity Framework 6は、高価なSQL Server以外のデータベースをサポートしていないか、サポートしていない追加のサードパーティ製のライブラリ(私の質問に記載されているように)を使用しないと、高速バルク挿入を提供できません。一方、エンティティフレームワークのコアは、別の話です。高速バルク挿入をサポートし、プロジェクトのEF 6をコードの変更だけで置き換えることができます。https://docs.microsoft.com/pl-pl/ef/core/index

+0

真実ですが、現時点ではef-coreはef6を完全に置き換えることができません。それを示唆するのを警戒する。 –

関連する問題