记一次To B开发普通的性能优化历程......报表优化

前言:

To B开发的道路上,永远不缺报表的需求~

需求背景:

这次是接到一个财务报表的需求,其实就是一个在线版Excel+财务数据定制化,在这个报表里,不仅要满足Excel表格的所有功能,还要支持给每个单元格配置额外的取数规则,因为在线版Excel,市面上早已经有了成熟的解决方案,所以....花点钱能解决的就不算问题,于是这次的重点就来到了这个定制化的取数上...

后端需求

这次的重点就是定制化的取数规则,比如某一个单元格,它的取数逻辑是where 维度1=A and 维度2=B and 维度3=C and... 如是下去,目前可以支持20个维度同时选择条件,当然如果,某个维度没有选择条件,则取该维度内所有“我”有权限的维值,比如维度4我没选,则 维度4 in (所有有权限的值)。

如果上面这个看起来还好,那再复杂一点点,就是现在一个单元格,不只是对应一套取数规则,而是对应多套上述这样的取数规则,每套取数规则都可以单独取出一个数据,然后两套取数规则取出的数据之间可以支持加减乘除的方式,计算出最终单元格的取数(目前只支持加减乘除)。

ok,需求确定了,接下来就是我这次的开发历程...

第一版:统一取数再回填

简单来说,就是将所有单元格的取数规则聚合到一起,取出一批结果集,然后再按单元格的取数规则回填到每个单元格。

举例:

单元格A1-取数规则:

select sum(贷款余额) as m0
where 维度1=A and 维度2=B and 维度3=C

单元格A2-取数规则:

select sum(贷款余额) as m0
where 维度1=A' and 维度2=B' and 维度3=C'

则聚合后的查询sql:

select sum(贷款余额) as m0, 维度1,维度2,维度3
where 维度1 in (A,A') and 维度2 in (B,B') and 维度3 in (C,C')
group by 维度1,维度2,维度3

查出来一批结果集,然后再遍历每个单元格,根据单元格的取数规则,从结果集中匹配出对应的结果。

优化:

这里做了一点优化,就是每次聚合一列单元格的取数规则,去开启一个线程执行查询语句,多列会开启多线程并发的执行查询。

问题:

问题一:数据发散。

还是以上述聚合后的sql为例:

select sum(贷款余额) as m0, 维度1,维度2,维度3
where 维度1 in (A,A') and 维度2 in (B,B') and 维度3 in (C,C')
group by 维度1,维度2,维度3

这个sql查出来的结果集中其实会包含大量交叉的不需要的结果,比如会查出:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值