2017-01-26 12 views
0

私は以下のシナリオを想定しています:毎分賭け率を引き出し、すべてのイベント、マッチ、オッズなどをデータベースに格納してUIを更新するダミーのWebアプリケーションを構築しています。SQL Serverデータベースに膨大な数のエンティティを格納する

私はこのような構造を持っている:スポーツ>イベント>マッチ>賭け>オッズと私はコードの最初のアプローチを使用していますし、すべてのDB関連の操作のために、私はEFを使用しています。 〜16スポーツ、〜145回のイベント、〜675試合、〜17100の賭け&〜72824のオッズ:私は非常に最初の時間のために自分のアプリケーションを実行していますし、私のデータベースは、私が含まれているオッズでXMLを受け付けております空である

問題が発生しました:このエンティティをすべてタイムリーに保存するにはどうすればよいですか?パーシングは時間がかかる操作ではありません.0.2秒ですが、これらのエンティティをすべてバルク保存しようとすると、メモリの問題に直面し、保存が1分以上かかるので、次の奇妙なプルがトリガーされ、これが悪夢です。

私はConfiguration.AutoDetectChangesEnabledを無効にして、私は挿入ごと100/1000、レコードの私の状況を再現するためにどこかで見ましたが、私はほとんど存在しないです。すべての提案は高く評価されます。事前

+0

「私はほとんどそこにいません」という意味は、あなたが試してみたことがそれほどありませんでしたか?私は個人的にバルク操作で同様の問題に直面しましたが、 'Configuration.AutoDetectChangesEnable'とコンテキストの再作成は少し助けましたが、私は全く別の方法を見つけました。 –

答えて

0

に私はあなたの状況を理解したがありがとう:あなたはそれをすべて行ってきたすべてのアクションを

は、マシンのスペックと ソフトウェア自体に依存します。

機械仕様で処理できない場合は、 の計画を変更して、挿入するレコード数を まで制限するようにしてください。

1

巨大な(それほど巨大ではありませんが)量のデータを挿入するときは、SqlBulkCopyを使用してみてください。 Table Value Parameterを使ってみて、ストアドプロシージャに渡すこともできますが、TVPが1000未満のレコードでうまく動作するため、このケースでは提案しません。SqlBulkCopyは使いやすい超簡単です。

多くのレコードを更新する必要がある場合は、SqlBulkCopyも使用できますが、少しでものトリックを使用してください。ステージングテーブルを作成し、SqlBulkCopyを使用してステージングテーブルに挿入し、ステージングテーブルからレコードを取得してターゲットテーブルを更新するストアドプロシージャを呼び出します。私は多くの時間の両方の場合のためにSqlBulkCopyを使用して、それはかなりうまく動作します。

さらに、SqlBulkCopyを使用すると、バッチで挿入することもできますし、ユーザーにフィードバックを提供することもできますが、私はあなたがそうする必要はないと思います。それにもかかわらず、この柔軟性は存在します。

EFのみを使用しても問題ありませんか?

私は試していませんが、試みることができるthisライブラリがあります。

+0

SqlBulkCopyの使用私は、80kの大量のエンティティを1.8秒間保存できましたが、これはEFの一部ではないため、EFのみを使用して行うことができますか? –

+0

EFは一括操作を直接サポートしていませんが、そのような機能を追加するライブラリを購入することができます。これは「Entity Framework Extensions」と呼ばれています。または、私のようにあなた自身で書くことができます。 – Amy

関連する問題