私は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未満かかります。エンティティはトランザクションを使用してより多くの挿入物をまとめても、すべてのオブジェクトをデータベースに挿入するという甘い時間がかかるようです。私は実際にそれを得ることはありません...
私はそれを本当にスピードアップするために何ができますか?
これ以上詳しく説明する人はいないかもしれませんが、EFは一括挿入用に設計されていません。 –
EFはあなたの箱からあなたを助けることができません。 EFの上に一括挿入を実装するサードパーティのライブラリがあります。 –
クライアントとDBサーバーの間のmsピングはどのようにして行われますか?また、接続プールソフトウェアを使用していますか? –