以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  再次讨论效率的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=40449)

--  作者:blackzhu
--  发布时间:2013/9/20 11:04:00
--  再次讨论效率的问题

既然如此,我重新将已付款列改为逻辑型,然后修改代码,直接在表达式中用1和0代替True和False进行比较:

Dim nms As List(of String) = DataTables("表A").GetUniqueValues("","客户")
DataTables(
"表B").StopRedraw()
For Each
nm As String In nms
    Dim
dr As DataRow = DataTables("表B").AddNew()
   
dr("客户") = nm
    dr
("付款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = \'" & nm & "\' And 已付款 = 1")
   
dr("欠款合计") = DataTables("表A").Compute("Sum(金额)", "客户 = \'" & nm & "\' And 已付款 = 0")
Next
DataTables(
"表B").ResumeRedraw()

在表A为5000行,客户数为1000的时候,执行上述代码所花费的时间为0.23秒,效果非常好。


  我用帮助的例子测试了,因为我的机器不太好,我在0.25秒的按钮上测试了三次


  第一次: 1.21875

  第二次: 0.09875

  第三次: 0.092

  第四次: 1.015625


  为啥 四次的结果不一样.


  我后来又加多了一个产品列 又进行了一次测试:


  代码如下:


  Dim nms As List(of String()) = DataTables("表A").GetUniqueValues("","客户","产品")

DataTables("表B").StopRedraw()
For Each 
nm As String() In nms
    Dim 
dr As DataRow = DataTables("表B").AddNew()
    
dr("客户") = nm(0)
     dr("产品") = nm(1)
    dr
("付款合计") = DataTables("表A").Compute("Sum(金额)""客户 = \'" & nm(0) & "\' And 产品=\'" & nm(1) & "\' And 已付款 = 1")
    
dr("欠款合计") = DataTables("表A").Compute("Sum(金额)""客户 = \'" & nm & "\' 
And 产品=\'" & nm(1) & "\' And 已付款 = 0")
Next
DataTables(
"表B").ResumeRedraw()

  又进行了四次测试:

  第一次:  2.390625
  第二次: 1.078125
  第三次:  1.09375
  第四次:  1.15

  测试下来  多一个列的数据  明显慢了很多,  如果加多多列  速度是不是会慢N多倍?

  


--  作者:blackzhu
--  发布时间:2013/9/20 11:12:00
--  
  测试了多列  也没有慢N多倍.
--  作者:yan2006l
--  发布时间:2013/9/20 13:29:00
--  

楼主搞错了一个概念:“分组列”增加一列,认为compute运行的次数会增加一倍。其实只有“统计列”增加一列那才会增加一倍的。

比如楼主的例子用客户做分组列,生成的统计表是1000行,那么compute运行的次数为1000*2=2000次

                    用客户和产品做分组列,生成的统计表绝对不是2000行,估计只有1100行,那么c的运行次数为1100*2=2200次   当然没什么大的变化

 

!只有增加统计列和增加基表的行数才会影响运行速率的;另外用系统工具不管多少列,基表几万行,生成统计表的时间都是固定的吧,用compute的话那就绝对和次数有关的


--  作者:e-png
--  发布时间:2013/9/20 14:36:00
--  
条件越多当然越慢罗。  特别是逻辑列做条件更慢,记得论坛有人特别说过的(好像是老大说的)

另外,可以结合 dictionary 来使用。

还有,如果表A中同客户的已付、未付的行数较多的话,还可以用DataTables("表A").Select ···

你给个例子(数据越多越好),要什么条件、达到什么结果一次说清楚,让大家测试吧。。。

--  作者:有点甜
--  发布时间:2013/9/20 19:35:00
--  
 支持四楼。使用compute统计的话,对统计的优化不足,如果能遍历一边所有行就统计得到你的数据的话,应该是最快的。

 用select,然后比较判断统计。

--  作者:jianjingmaoyi
--  发布时间:2013/9/20 20:03:00
--  
以下是引用有点甜在2013-9-20 19:35:00的发言:
 支持四楼。使用compute统计的话,对统计的优化不足,如果能遍历一边所有行就统计得到你的数据的话,应该是最快的。

 用select,然后比较判断统计。

 

 我说呢 应该跟条件有关.