2013-05-06 50 views
0

我正在设计一个ASP.NET应用程序,它将构建一段时间内每个合作伙伴的所有销售总览。 它是如何工作至今:处理大量的选择语句

  1. 选择所有partnerNo(SQL服务器),并添加到列表(ASP.NET)
  2. 过段时间(SQL-Server)的partnerNo1的选择销售,总结他们( ASP.NET),并将其添加到DataTable(ASP.NET)
  3. partnerNo2的选择销售过段时间,总结并将其在一段时间内增加partnerNo3的数据表
  4. 选择销售,总结并将将它们添加到数据表中

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

我真的希望,我可以解释它足以让某人来帮助我。

关于

Dirk Th。

+0

你正在使用哪个框架版本? – granadaCoder 2013-05-06 13:39:15

+0

如果要生成汇总数据,另一个选项可能是查看Microsoft SQL Server Analysis Services(SSAS)。 – jpw 2013-05-06 13:54:11

回答

2

这就是RBAR anti-pattern。应该可以创建一个SQL查询来返回所有合作伙伴的摘要信息。

这通常要快得多:数据越少越少,越不经常。往返数据库可能需要50ms。如果你做了600个,那么你的网页超时时间为30秒。

+0

问题不是总结,而是数据本身......我必须从列中进行计算,我不想在结果中显示......类似这样的内容: 'dr [“umsVJ”] = (Convert.ToDecimal(dr [“wertNettoTotal”])!= 0 && Convert.ToDecimal(dr [“wertNettoTotalVJ”])!= 0)? ((Math.Round(Convert.ToDecimal(dr [“wertNettoTotal”])* 100/Convert.ToDecimal(dr [“wertNettoTotalVJ”]),2) - 100).ToString()):((Convert.ToDecimal [“wertNettoTotal”])== 0)?((Convert.ToDecimal(dr [“roherloesVJ”])> 0)?“-100”:“0”):(((Convert.ToDecimal(dr [“roherloesVJ”] )== 0)?“100”:“0”));' – 2013-05-06 13:13:42

+1

看起来你可以在SQL中做点努力 – Andomar 2013-05-06 13:19:23

+0

我玩了一下,看起来,它真的是大量的选择,这会减慢一切......嗯,我的老板不会喜欢它,我们必须改变所有的代码,但是,嘿,比没有得到任何结果更好。谢谢。 – 2013-05-06 15:10:36

0

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

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

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

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

........

选项2,更“传统”的做法是打了你需要的一切数据库。 我会放弃DataTables,并开始使用DTO或POCO对象。

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

转到数据库,不要使用游标或循环,并为您需要的所有信息命中数据库。在你拿回来之后,把它装入DTOs/POCO的依赖只读属性,你可以(对于派生值)..........然后如果你必须运行一些业务逻辑来计算出来一些派生的值,然后这样做。

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

+0

“转到数据库,不要使用游标或循环,并打开数据库以获取所需的所有信息。”......这与Andomar提到的RBAR模式相反。逐行排列会减慢你的速度。 – granadaCoder 2013-05-06 13:47:46