1

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 ミリ秒

ご覧のとおり、SQL クエリの作成と実行は、更新しているエンティティへの参照が存在するかどうかを確認するのに費やされた時間に比べれば小さくなります (参照がない場合、エンティティは挿入されますが、この場合はすべての更新されたエンティティが存在します)。なぜこれが発生するのかは理解していますが、データの整合性を維持するためなどに、これらの定期的な更新操作のパフォーマンスが低下しています。

私は ObjectTrackingEnabled を false に設定することを検討しましたが、それにより DataContext が読み取り専用になり、それは私には役に立ちません - 私の問題は特に更新時のパフォーマンスにあります。

更新のパフォーマンスを向上させるためにできることはありますか? 1 回の送信で 40 ~ 50 の挿入と 80 以上の更新をプッシュしようとするという点で、最適とは言えない方法で DbLinq を使用していますか? もしそうなら、これについてもっと良い方法はありますか?

4

1 に答える 1

1

データを読み取り、データを変更し、変更を送信し、同じ DataContext オブジェクトを使用して繰り返す、有効期間が長い DataContext を使用すると、パフォーマンスに悪影響を与える可能性があります。DataContext がエンティティを実体化すると、オブジェクト追跡の一部として DataContext の存続期間中、エンティティを内部に保持します。時間の経過とともに、この内部キャッシュが大きくなる可能性があり、場合によっては事実上、データベースの大部分のメモリ内キャッシュになります。これにより処理が遅くなり、SubmitChanges 中の DataContext の作業が増える可能性があります。

DataContext は短命であることを意図しています。その寿命は作業単位である必要があります。作って、何かに使って、捨てる。

ここにいくつかの詳細があります:

DataContext の再利用がパフォーマンスに悪影響を与えるのはなぜですか?

これは、製品に近い人によるものです。

http://blogs.msdn.com/b/dinesh.kulkarni/archive/2008/04/27/lifetime-of-a-linq-to-sql-datacontext.aspx

長期間の使用: DataContext 自体は、クエリを通じてオブジェクトを取得すると、オブジェクトを上書きしません。そのため、取得したオブジェクトが頻繁に変更されると、時間の経過とともに古くなる可能性があります。

SubmitChanges() 後のライフ: SubmitChanges() の後に DataContext を使用できますが、注意が必要です。SubmitChanges() は、オブジェクト グラフに加えたすべての変更を把握するという大変な作業をすべて行います。CUD 操作を順序付けし、変更された各オブジェクトの粒度で楽観的同時実行性チェックを提供します。

于 2012-06-19T20:21:22.043 に答える