ecell性能优化---取数函数参数(条件)顺序对性能的影响
难度等级3
取数函数定义时,将使用同一个数据源的所有函数的条件数据项和条件顺序一致,并且返回值合并方式必须一致、排序方式必须一致,这样可以提高明细数据项的计算速度
如:函数a的条件是 身份证号和产品编号,函数b是 产品编号和身份证号,这样它们将得不到优化
如果调整函数b的条件顺序也为:身份证号和产品编号,那么他们会被系统批处理
下面会详细解释为什么会这样。不想看解释的,只要执行这条指导思想就可以了
先介绍4个概念
1.cell函数的执行机制,cell函数(不论是取数函数还是内置函数)都只有在参数所引用的单元格的值改变时,函数才触发。
2.当表单中的一个取数函数需要执行时,会先在web缓存中搜索是否已经缓存了计算结果。如果没有就需要请求服务器做计算,这样速度就比从web缓存拿要慢的多了。
3.取数函数分组,为了提高本地缓存命中率,我们设计了一个执行策略--当一个取数函数请求后台执行时,如果有与它参数一致的其他函数,那么这些函数将一同执行,并将结果缓存在web端。
4.取数函数分组策略:使用同一个数据源,并且条件数据项和条件顺序一致,并且返回值合并方式必须一致、排序方式必须一致
在实际环境中,在很短的时间内会触发大量取数函数的情况只有一个----填充明细时,明细中的分组越少,执行速度会比分组多时的要快
下面给出几句sql,用于查看取数函数分组与取数函数定义之间的关系
取数函数的个数:SELECT * FROM UserFunctions where formid = (select id from formlist where formname = 'xxx')
取数函数分组情况(如果分组的函数只有一个,将不会保存到fungroups表中):SELECT * FROM FunGroups where formid = (select id from formlist where formname = 'xxx') order by formid
取数函数分组的数量等于下面两个sql的结果相加
SELECT count(*) FROM UserFunctions where formid = (select id from formlist where formname = 'xxx')and id not in (SELECT id FROM FunGroups where formid = (select id from formlist where formname = 'LINK'))
SELECT count(distinct groupname) FROM FunGroups where formid = (select id from formlist where formname = 'xxx')