以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  表达式问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=126659)

--  作者:kmk123456
--  发布时间:2018/10/26 9:49:00
--  表达式问题
用这个表达式时,有这个表达式的表能正常加载,加载时间大概2分钟左右:
IIF((IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0)) = 0 or (IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0)) is null, Null ,(IsNull([库存_七月金额],0) + IsNull([入库_八月_金额],0)) /(IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0) ))
如将它改成:
IIF((IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0)) = 0 or (IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0)) is null, [移动平均成本_七月] ,(IsNull([库存_七月金额],0) + IsNull([入库_八月_金额],0)) /(IsNull([库存_七月数量],0) + IsNull([入库_八月_数量],0) ))
那么,加载这个表的时间就会延长至少10倍。
是什么原因呢?

--  作者:有点蓝
--  发布时间:2018/10/26 10:04:00
--  
[移动平均成本_七月]应该也是表达式列吧,说不定[移动平均成本_七月]里面又引用了其它表达式列,这样会形成了一个表达式计算树,当前节点计算依赖子节点(引用的其它表达式列)计算完毕,而子节点可能又依赖孙节点计算完毕,每个节点根据表达式的复杂性(可能需要计算当前行,可能需要计算整个表数据)需要一定时间。

所以当这个表达式树节点层次越深(表之间的引用越多),计算的数据越多(表数据越多),就可能导致表达式计算时间会呈指数级别递增,而不是倍数递增

--  作者:kmk123456
--  发布时间:2018/10/26 10:08:00
--  
但同样的计算量,在execl中几乎是瞬间完成的啊
--  作者:有点蓝
--  发布时间:2018/10/26 10:17:00
--  
狐表和execl的处理逻辑完全不一样,没有可比性

要想使用好狐表先忘记execl,如果照搬execl的思维,越往后可能会越痛苦。不要过于依赖表达式。

另外表格的设计,业务数据的存储不要和统计表混为一体,业务数据和统计数据要分开,统计分析是基于业务数据的深加工,而且这种加工本身就是耗时的

--  作者:kmk123456
--  发布时间:2018/10/26 15:17:00
--  
你不认为狐表在统计分析处理方面有要改进的地方吗
--  作者:有点蓝
--  发布时间:2018/10/26 15:38:00
--  
狐表的表达式很弱,远远不能和execl比。狐表的统计分析功能基本和列表达式没有什么关系,何况狐表的表达式主要也不是用来做统计分析的

不编程的情况下,狐表也提供了一些通用的、基础的统计分析功能。似乎您都没有用到:http://www.foxtable.com/webhelp/scr/00143.htm
如果通过编程,可以实现更加复杂的统计分析功能,具体可以看【开发指南】-》【统计与查询】