1

本番環境でパフォーマンスの問題があり、解決しようとしています。それを解決しようとしている間、私たちはデータテーブルに目を向けています。

私たちの流れ:

  1. データベースで選択クエリを実行します
  2. データをDataTable
  3. StringBuilderすべてのデータをセパレーター付きのに書き出します
  4. は、CSV ファイルを作成する にすべてのStringBuilderテキストを書き込みます。Response.Write

問題は本番環境にあり、クライアントは操作がタイムアウトしたと言っています。本番環境でのデータ量が原因である可能性があるため、開発環境でタイムアウトを再現することはできません。

ステップ 1 :

選択クエリでプロファイラーを実行しましたが、これは非常に高速に実行されます。

ステップ 2 :

次のコードがあります。

SqlDataReader reader = searchQuery.ExecuteReader();
returnTable.Load(reader);

ステップ 3 :

returnTable次のように繰り返します。

foreach (DataRow order in orders.Rows)
{
      trackingNumber = order["TrackingNumber"] != null ? order["TrackingNumber"].ToString() : errString;
      created = order["Created"] != null ? ((DateTime)order["Created"]).ToString() : errString;
      // rest of the fields
}

ステップ 4:

HttpContext.Current.Response.Write(bld.ToString());

では、ステップ 2 を実行するとどうなるでしょうか。DataTableフルロードですか?

手順 3 ですべての行でデータベースをポーリングすると、プロセスが遅くなる可能性があるため、問題が発生する可能性があります。しかし、一度にすべてをロードすると、これがどのように問題になるかわかりません。

基本的に、DataTableすべてを一度にロードしますか、それとも遅延ロードを使用しますか?

4

1 に答える 1

4

ステップ 2 を実行すると、何が起こるでしょうか。データテーブルは完全にロードされていますか?

クエリによって返されたすべての値がアプリケーションに転送され、DataTable.

遅延読み込みを使用しますか?

いいえ、そうではありません。


できること:

  • 制限付きクエリを検討してください - 上位 100 行 (または該当するもの) のみを返します。何千もの場合、それは役に立たない可能性があります。
  • 上記の場合、ページングを使用して、限定された結果セットのみをフェッチして表示することを検討してください。
  • クエリを最適化します。テストで高速に実行されても、クエリが最適であるとは限りません。クライアントが持っている同様の量のデータでこれをテストすることをお勧めします。
于 2012-11-07T12:17:35.353 に答える