2

ASP.NET Web フォームを使用しており、SQL サーバーからデータを読み込もうとしています。これが私がそれを行う方法に関する疑似コードです:

connect1 = connect("database")
categories = connect.query("select * from category")
loop categories as category

     print category           

     connect2 = connect("database")
     subCategories = connect2.query("select * from subCategory where category = @0", category) 
     loop subCategories as subCategory

           print subCategory               

           connect3 = connect("database")
           items = connect3.query("select * from item where subCategory = @0", subCategory)
           loop items as item
                 print item
           end loop 'items
           connect3.close

     end loop 'subcategories
     connect2.close

end loop 'categories
connect1.close

ご覧のとおり、私のスクリプトでは多くのラウンドトリップが行われています。レコードが少ない場合はこれで問題ありませんが、数百以上のレコードを扱う場合、データを表示するのに非常に時間がかかります。

往復回数を減らすにはどうすればよいですか?データベースからすべてのデータを一度に取得し、アプリケーション側で分類することを考えましたが、それは可能ですか?

4

2 に答える 2

2

結合を使用して 1 つのクエリで必要なすべてのデータを取得し、クライアント側でフィルター処理してみませんか。または、それを行うことができる他の方法(データが多すぎない場合)は、データをxmlとして取得し、それを逆シリアル化して列挙可能にすることです。

私が見るように、あなたはそうします

categories = connect.query("select * from category");

必要なのは次のとおりです。

whole_data = connect.query("select * from category c inner join subCategory sc on c.id = sc.id inner join item i on i.id = si.id") /*or some kind of*/
/*let me think that whole_data is a list of objects, not a dataset*/
categories = whole_data.Distinct(d => d.category);
subCategories = whole_data.Distinct(d => d.subCategories);
/*and then do your loops*/

手動マッピングの c# コードは次のようになります。

        using (var connection = new SqlConnection(connString))
        {
            connection.Open();
            var command = connection.CreateCommand();
            command.CommandText = "select * from ...";

            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                var a = reader.GetInt32(0);
                var b = reader.GetString(1);
                /*so basically you read all fields that you get from DB and build object here, then you add it to List or any other kind of collection*/
            }
        }
于 2013-02-27T08:48:54.357 に答える
1

データベースへの待機時間によっては、プールされている場合でも、接続の確立に時間がかかる場合があります。そのオーバーヘッドを回避するには、すべての接続をループの外側で行います。つまり、接続をネストしないでください。代わりに、次のように構成します。

Connect1 = connect("database")
Connect2 = connect("database")
Connect3 = connect("database")

sql 1 nest
    sql 2 nest
        sql 3 nest
        end nest
    end nest
end nest

close connections.

ループごとに 10 エントリがあり、接続に 10 ミリ秒かかる場合、接続を行うだけで 10 x 10 x 10 = 1000 ミリ秒を費やすことになります。それらを巣の外に連れ出してから、接続に費やすのはわずか 30 ミリ秒です。各ネストの完了時にデータリーダーを閉じて、接続を再利用できるようにします。

もちろん、あなたが示した例では、単一のクエリを実行することが最善の解決策です。ただし、クエリが選択的であり、クエリで結合できないビジネス ロジックを実行する必要がある場合は、常に接続をループの外に移動します。

于 2013-03-29T10:41:07.043 に答える