[ad_1]
やあみんな
私はいくつかのプロジェクトに取り組んでおり、SQLデータベースからデータを取得してDatatableに入力しています。正常に動作しますが、パフォーマンスの問題です!
どうすればパフォーマンスを向上させることができ、パフォーマンスに関する提案があれば!
ありがとう!
私が試したこと:
using (SqlCommand cmd = new SqlCommand("sp_loadGuest", MainClass.con)) { cmd.CommandType = CommandType.StoredProcedure; using (SqlDataAdapter da = new SqlDataAdapter(cmd)) { DataTable dt = new DataTable(); da.Fill(dt); // it takes many sec ... } }
解決策 1
DataAdapter は DataReader と同じではありません。すぐには返らず、DB から行ごとにデータをフェッチします。 代わりに、データベース サーバーがすべてのデータを内部テーブルに完全にロードするのを待ちます。その後、単一のストリームとしてプレゼンテーション言語アプリに転送され、DataTable にまとめてロードされます。 行の完全なセットの準備ができて初めて、Fill メソッドがコードに戻ります。
そのため、SP が大量のデータを収集する場合、それはサーバー上でメモリ割り当ての確実なチャンクを意味し、その後にサーバーとアプリ PC の間の帯域幅のかなりのチャンクが続き、さらにチャンク (または多くの場合、多くのチャンク) が続きます。 )保存されたデータがあなたに渡される前に、PCのメモリ割り当ての。
これは、サーバー上で直接クエリを実行する場合と同じです。これは、行の表示を開始する前に必ずしも待機する必要はなく、利用可能なデータがあればすぐに表示を開始するため、純粋にかなり高速に見える場合があります。
このような問題は、PC と DB サーバーの両方でコードにアクセスする必要があり、問題が発生している実際のシステムでコードが実行されている間に処理中の実際の DB データにアクセスする必要があります。 そして、私たちはそのどれにもアクセスできません!
解決策 2
あれを使って
使用 (SqlDataAdapter da = 新しい SqlDataAdapter(cmd))
{
DataTable dt = 新しい DataTable();
cmd.CommandTimeout = 3600;
da.Fill(dt);
}
[ad_2]
コメント