处理大量的选择陈述

时间:2013-05-06 13:05:31

标签: asp.net sql-server

我正在设计一个ASP.NET应用程序,它构建了一段时间内每个合作伙伴的所有销售概览。 到目前为止它是如何工作的:

  1. 选择所有partnerNo(SQL-Server)并添加到List(ASP.NET)
  2. 选择partnerNo1在一段时间内的销售(SQL-Server),汇总它们(ASP.NET)并将它们添加到DataTable(ASP.NET)
  3. 在一段时间内选择partnerNo2的销售额,汇总并将其添加到数据表中
  4. 在一段时间内选择partnerNo3的销售额,汇总它们并将它们添加到数据表中
  5. 等等

    现在问题是:如果我只选择TOP 100 partnerNo,如果需要一段时间,但我得到一个结果。如果我将TOP更改为1000,则SQL-Server将处理SQL语句 (可以看到他在activitymonitor中工作),iis-server正在为他提供新的SQL-Selects ......但是过了一段时间,iis正在终止浏览器的页面请求,所以没有显示结果

    我真的希望,我可以解释一下,有人帮助我。

    关于

    Dirk Th。

2 个答案:

答案 0 :(得分:2)

那是RBAR anti-pattern。应该可以创建一个返回所有合作伙伴的汇总信息的SQL查询。

这通常要快得多:数据越少越好,而且频率越低。到数据库的往返可能花费50毫秒。如果您执行其中的600次,则网页超时时间为30秒。

答案 1 :(得分:0)

如果您有Framework 4.5,并且获取每个partnerN的摘要数据是互斥的,您可以尝试并行任务。

http://msdn.microsoft.com/en-us/library/dd460720.aspx

现在,这不是一个简单的主题。但它可以让你利用多个处理器。

第一条规则。你不能依赖于序列。

........

选项2,更“传统”的方法是在数据库中找到您需要的一切。 我会放弃DataTables,并开始使用DTO或POCO对象。

然后,您可以创建替换计算/派生数据表列的迷你“只读属性”。

转到数据库,不要使用游标或循环,并点击数据库以获取所需的所有信息。把它拿回后,把它放到DTOs / POCO中依赖于只读属性你可以(对于派生值)..........然后如果你必须运行一些业务逻辑来弄明白一些派生值,然后这样做。

如果您对表示层的DataSet / DataTable“卡住”,您可以循环遍历DTO / POCO并将它们填充到DataSet / DataTable中。