2

データベースには、アプリケーションで処理する必要のある50,000を超えるレコードがあります(その数は、最低でも2000 /日増加しています)。

私が現在使用している方法は次のとおりです。データベースにストアドプロシージャを持つエンティティへのLinqは、オブジェクトのコレクションを返し、処理できるようにします。

しかし、それは遅いことに気づきました。データベースからそのような数のレコードを取得するための最も効率的な方法は何ですか?

私のコードのサンプル:

   items = (from f in db.spItems().OrderByDescending(f => f.date)
                  group f by f.ID into g
                  select g.FirstOrDefault()).Take(9).ToList();
                  join ar in db.anothertable on f.ID equals ar.ID
                  join t in db.thirdtable on ar.tid equals t.ID

spItemsは結果を取得するストアドプロシージャですが、複数の結合を実行する必要がある場合があります

4

3 に答える 3

5

まず、クエリの最適化を試みます。SSMSで遅いですか?適切なインデックスを使用していますか? すべての列が必要ですか。最も重要: 50000 行すべてを表示する必要がありますか?

50000 レコードは多くのレコードではありませんが、Web アプリケーションですべてを表示するのは珍しいことです。これは、すべてのレコードの HTML を生成し、それをクライアントのブラウザーに表示する必要があることを意味するためです (場合によっては を使用する場合もありますViewState)。したがって、データベース ページング (ROW_NUMBER関数経由で fe) を使用して結果セットを分割し、表示するデータのみをクエリすることをお勧めします (fe でページあたり 100 行GridView)。

大量のデータを効率的にページングする

于 2012-11-12T09:55:07.093 に答える
4

次の手順を検討してください。この種の問題では、複数のレイヤーで作業する必要があります。

1. ADO.net を使用して結果をフェッチする標準的な方法を使用します。LINQ to SQL は最終的に ORM (追加レイヤー) であるため、明らかにパフォーマンスが低下します。これは、あなたの場合と同じように顕著です。ここを参照

2.インデックスの追加、間違ったデータ型の選択などの見落としがない場合は、テーブルの設計をもう一度見直してください。

3. ストアド プロシージャのパフォーマンスを向上させる:ここを参照

4. データを分割します。: 読み取り専用の場合 (または使用されなくなった場合) は、古いデータを他のテーブルに移動しました。これは、新しい最小 2000 行が毎日追加されることを示しているためです。したがって、テーブルのサイズは大幅に縮小されます。この決定は非常に慎重に決定してください。

于 2013-10-07T15:42:04.970 に答える