以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 表达式问题 (http://foxtable.net/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比。狐表的统计分析功能基本和列表达式没有什么关系,何况狐表的表达式主要也不是用来做统计分析的 如果通过编程,可以实现更加复杂的统计分析功能,具体可以看【开发指南】-》【统计与查询】
|