DbLinq 経由で MySQL データベースに接続する ASP.NET MVC2 サイトがあります。サイトで一定の間隔で実行される特定の一連のアクションがあります。これには、いくつかのテーブルの特定のレコード セットをループして更新し、他のテーブルにいくつかの新しいレコードを追加することが含まれます。
私は中程度のサイズのデータセットでテストしてきました。現在の私の特定のテスト セットでは、更新時に 44 の新しい行が挿入され、81 の他の行が更新されます。しかし、SubmitChanges() への私の呼び出しには非常に長い時間がかかります - ~3-4 分です。これは、比較的少数の変更を DB にプッシュするのに長い時間がかかるようです (私が思っていたこと)。
最終的に簡単なプロファイリングを行ったところ、データベースでクエリを実行したり、クエリを作成したりすることに問題があるようには見えないことがわかりました。ほとんどの時間は、UpdateEntity 内での AllTrackedEntities.ContainsReference() の呼び出しに費やされているようです。
実際の数値を示すために、最近のテスト実行から:
- SubmitChangesImpl の時間: 204884 ミリ秒
- UpdateEntity の時間: 200908 ミリ秒
- ContainsReference の時間: 148173 ミリ秒
- QueryBuilder.GetUpdateQuery の時間: 685 ミリ秒
- QueryRunner.Update の時間: 28 ミリ秒
- UpdateReferencedObjects の時間: 49958 ミリ秒
- UpdateEntity の時間: 200908 ミリ秒
ご覧のとおり、SQL クエリの作成と実行は、更新しているエンティティへの参照が存在するかどうかを確認するのに費やされた時間に比べれば小さくなります (参照がない場合、エンティティは挿入されますが、この場合はすべての更新されたエンティティが存在します)。なぜこれが発生するのかは理解していますが、データの整合性を維持するためなどに、これらの定期的な更新操作のパフォーマンスが低下しています。
私は ObjectTrackingEnabled を false に設定することを検討しましたが、それにより DataContext が読み取り専用になり、それは私には役に立ちません - 私の問題は特に更新時のパフォーマンスにあります。
更新のパフォーマンスを向上させるためにできることはありますか? 1 回の送信で 40 ~ 50 の挿入と 80 以上の更新をプッシュしようとするという点で、最適とは言えない方法で DbLinq を使用していますか? もしそうなら、これについてもっと良い方法はありますか?