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

为什么不通过一个带有连接的查询来获取所需的所有数据,然后在客户端进行过滤?或者你可以做的其他方式(它没有太多的数据)是获取数据作为 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 回答