本番環境でパフォーマンスの問題があり、解決しようとしています。それを解決しようとしている間、私たちはデータテーブルに目を向けています。
私たちの流れ:
- データベースで選択クエリを実行します
- データを
DataTable
StringBuilder
すべてのデータをセパレーター付きのに書き出します- は、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
すべてを一度にロードしますか、それとも遅延ロードを使用しますか?