以文本方式查看主题 - 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("","客户") 在表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,然后比较判断统计。
我说呢 应该跟条件有关. |