Foxtable(狐表)用户栏目专家坐堂 → 再次讨论效率的问题


  共有3725人关注过本帖树形打印复制链接

主题:再次讨论效率的问题

帅哥哟,离线,有人找我吗?
blackzhu
  1楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9875 积分:57596 威望:0 精华:15 注册:2008/9/1 9:45:00
再次讨论效率的问题  发帖心情 Post By: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
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9875 积分:57596 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2013/9/20 11:12:00 [只看该作者]

  测试了多列  也没有慢N多倍.

 回到顶部
帅哥哟,离线,有人找我吗?
yan2006l
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:431 积分:3214 威望:0 精华:2 注册:2011/9/10 21:35:00
  发帖心情 Post By:2013/9/20 13:29:00 [只看该作者]

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

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

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

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
e-png
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1695 积分:10725 威望:0 精华:0 注册:2009/10/25 16:45:00
  发帖心情 Post By:2013/9/20 14:36:00 [只看该作者]

条件越多当然越慢罗。  特别是逻辑列做条件更慢,记得论坛有人特别说过的(好像是老大说的)

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

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/9/20 19:35:00 [只看该作者]

 支持四楼。使用compute统计的话,对统计的优化不足,如果能遍历一边所有行就统计得到你的数据的话,应该是最快的。

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

 回到顶部
帅哥哟,离线,有人找我吗?
jianjingmaoyi
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:760 积分:4714 威望:0 精华:0 注册:2011/12/17 18:37:00
  发帖心情 Post By:2013/9/20 20:03:00 [只看该作者]

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

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

 

 我说呢 应该跟条件有关.


 回到顶部