记录岁月云明细账excel导出的性能优化

财务软件报表还是非常麻烦,因为使用excel最好的就是财务,但是通过java导出excel,使用easyexcel不用报表工具,不是这么容易。采用jprofile对一个导出操作进行监控,其中一家零售企业导出当月全部明细账,检测到工程师编写的这个逻辑执行了2807次。估计很多人难以想想,这种sql是怎么上生产环境的。原因在于如果针对没有多客户的公司,原先的写法是没有问题的,但是针对面向有25万用户的零售企业,这种问题就暴露出来了。
1
查询条件
在这里插入图片描述
导出的报表样式
1
2

1 分析需求
有些工程师有洁癖,比如我。别人的代码写不好,干脆重写,而不是改,哪些防御式代码估计工程师本人也未必能看懂。因此第一步是分析需求,而不是看别人代码的的逻辑。
上图分析

  • sheet的名称是根据一级科目创建
  • 报表有两种默认,一种带辅助核算,一种不带辅助核算。
  • 表格中的数据来自查询期间、账套、科目余额、凭证,和计算出来的本期合计和本年累计。

2 分析问题
从sql入手,而不是程序入手原因是因为去理解有些工程师的思路,个性化太强,而sql语句至少有一个标准。是理解起来最容易的语言。
下面查看多次执行的sql到底做了些什么?
2.1 acc_account_balance
通过分析可以看到acc_account_balance 分别执行了571、463、108次,合计执行了1142次
1
1
2
2.2 acc_voucher
acc_voucher执行了363、70、55、45,合计553次
2
2
3
2
2.3 acc_assisting_accounting
acc_assisting_accounting执行了376、51、42次
在这里插入图片描述
2

2.4 acc_account_set
acc_account_set执行了571次
2
2.5 acc_account_subject
acc_account_subject执行了36次
1
3 优化思路指引

  • 数据库:① 查询利用索引。② 减少查询次数。③ 缓存。
  • 程序:① 多线程并发执行,充分利用计算机资源。② 通过程序计算过滤,而不是数据库。
    4 开干
    4.1 使用CompletableFuture加载数据
    使用CompletableFuture中的任务编排,将所需要的数据加载进来,下面的科目是基础资料,采用二级缓存,这里就不讲了,mysql performance schema 实践,这篇文章我已经讲了3

从下图可以看到获取数据的时间从50s,下降到268ms,单纯的看数据获取,性能优化了99.47%,速度提升187倍2 4.2 组装数据优化
前一个环节只是组装数据,接下来要将这些数据,拼装成excel模板可以用到的数据 。这一款属于业务算法,如果有时间可以重写,但实际改造时间并不会给你太长时间,首先老板会觉得性能优化是员工自身的问题,根本不会在一这个。
我所做的是新建一个v2版本,如果有问题,原来的代码还能用,以免被人诟病,研发工程师内卷,相互轻视的事情也是经常发生的。
在这里插入图片描述
接着将上面的数据传入到一个方法中
1
然后复用之前的一些好的封装逻辑,如果不好可以重写,但还是要注意不要轻易把别人代码删掉,否则那些人有可能会记恨你。
内存中的计算是非常快的,所以筛选也通过流来实现,如下。你会发现你的程序飞快。
2
因为其他的算法不具备通用性,就不黏贴出来了,但总体思路就是这样,不需要把问题想得太复杂

5 实际效果
导出的sql只需要200多ms,这还是我本地的机器。服务器上更快,这个性能优化已经算是很成功了。
1
为什么我愿意把这些岁月会计云的优化分享出来,因为技术这东西老板们是不会关心的,这些属于通用性技术,并不像芯片那样具有核心竞争力。有好的经验分享出来,是一种回向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/664821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库--从创建数据库到删库跑路

目录 MySQL安装: 1. 数据库基本操作1.1 创建数据库1.2 显示当前数据库1.3 删除数据库1.4 使用数据库/选中数据库 2. SQL中的数据类型2.1 数值类型2.2 字符串类型2.3 时间类型 3. 表的操作3.2 创建表3.1 显示数据库中的表3.3 查看表的详细情况3.4 删除表3.5 注释3. 修改列(了解即…

dubbo复习:(18)服务端Filter

用来在服务响应返回到客户端之前进行额外处理。 一、定义Filter package cn.edu.tju.config;import org.apache.dubbo.rpc.Filter; import org.apache.dubbo.rpc.Result; import org.apache.dubbo.rpc.Invoker; import org.apache.dubbo.rpc.Invocation; import org.apache.du…

检定记录内容解析:非红外二氧化硫气体检测仪的维护与验证

在工业生产与环境保护中,二氧化硫作为一种常见的有害气体,其浓度的监测和控制显得尤为重要。 非红外二氧化硫气体检测仪以其独特的检测原理和高灵敏度,在二氧化硫监测领域发挥着不可或缺的作用。 在这篇文章中,佰德将详细介绍非…

神经网络与深度学习——第4章 前馈神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第4章 前馈神经网络 前馈神经网络 神经元 Sigmoid型函数 Hard-Logistic函数和Hard-Tanh函数 ReLU函数 带泄露的ReLU 带参数的ReLU ELU函数 Softplus函数 Swish函数 GELU函数 Maxout单元 网络结构 前馈网络…

CentOS 7基础操作02_优化Linux操作系统中的服务

1、实验环境 公司在文件服务器中新安装了CentOS系统.由于默认启动的服务程序较多,系统运行缓慢。现需要对系绞服务进行适当优化,减少一些不必要的自启动服务.并设置系统在开机后直接进入字符模式。 2、需求描述 根据实际使用需求对CentOS 7操作系统中的…

PLC无线通讯模块

在工业自动化日益深入的今天,PLC(可编程逻辑控制器)作为工业控制的核心大脑,其功能的扩展和智能化水平直接影响着整个生产线的效率和安全性。而PLC无线通讯模块,作为连接PLC与外界信息世界的桥梁,其重要性不…

揭秘Python:下划线的特殊用法,你绝对想不到!

在Python编程中,下划线(underscore)是一个常见而又强大的工具。它不仅仅是一个普通的字符,而是具有特殊含义和用法的符号。今天,我们就来揭开Python下划线的神秘面纱,探索它的各种妙用。 下划线的基本用法…

前端html-docx实现html转word,并导出文件,文字+图片

前端html-docx实现html转word,并导出文件 前端web页面 有文字,有图片,保存web的css效果 使用工具:html-docx 官方网址:http://docs.asprain.cn/html-docx/readme.html 步骤: 1 npm install html-docx-js…

边缘网关在数据采集方面发挥的作用-天拓四方

随着物联网技术的快速发展,边缘网关作为连接物理世界与数字世界的桥梁,其重要性日益凸显。特别是在数据采集方面,边缘网关以其独特的优势,为物联网系统的运行和管理提供了强大的支持。本文将从边缘网关的基本概念、数据采集流程、…

vcruntime140_1.dll在哪个文件夹?详细修复vcruntime140_1.dll缺失的方法

vcruntime140_1.dll文件是什么?相信很多人都对它很陌生吧?毕竟大部分人对于dll文件还是了解得太少了,当突发情况出现vcruntime140_1.dll文件丢失?你要怎么办?不要担心,下面我们就来给大家详细的讲解一下修复…

记一次netty客户端的开发

背景 近日要开发一个tcp客户端程序去对接上游厂商的数据源,决定使用netty去处理,由于很久没有开发过netty了,顺便学习记录下 netty搭建 考虑到我们需要多个client去对接server服务,所以我们定义一个公共的AbstractNettyClient父…

2024最新智能优化算法:常春藤算法(Ivy algorithm,LVYA)求解23个函数,提供MATLAB代码

一、常春藤算法 常春藤算法(Ivy algorithm,LVYA)是Mojtaba Ghasemi 等人于2024年提出智能优化算法。该算法模拟了常春藤植物的生长模式,通过协调有序的种群增长以及常春藤植物的扩散和演化来实现。常春藤植物的生长速率是通过微分…

Apache Druid 代码执行(CVE-2021-25646)漏洞复现

Druid简介与漏洞成因 Apache Druid是一个高性能的实时分析型数据库,旨在对大型数据集进行快速查询分析。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图形化界面&am…

Java 内存泄露风险

目录 内存泄露的定义 潜在的内存泄露场景 未关闭的资源类 未正确实现 equals() 和 hashCode() 非静态内部类 重写了 finalize() 的类 针对长字符串调用 String.intern() ThreadLocal 的误用 类的静态变量 虽然 Java 程序员不用像 C、C 程序员那样时刻关注内存的使用情…

常见场文件解析

收费工具,白嫖党勿扰 收费金额2000元 1 概述 因某所项目比较特殊,需要对各种格式场文件进行可视化展示,要对场可视化展示,首先要做的,是要解析场文件中存储哪些信息。好在,有个ParaView开源免费工具&#…

产品人生(9):从“波士顿矩阵”看“个人职业规划”

波士顿矩阵(简称BCG矩阵)是一种战略规划工具,由波士顿咨询公司的创始人布鲁斯亨德森(Bruce Henderson)于1970年代初提出的,它以两个关键指标作为分析维度:市场增长率和相对市场份额,…

香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(二)

整期笔记索引 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(一) 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(二) 香橙派OrangePi AIpro上手笔记——之USB摄像头目标检测方案测试(…

npm run dev 同时运行vue前端项目和node后端项目

将两个项目放到一个目录下 项目拖进vscode中,安装包依赖,修改配置 npm i concurrently "dev": "concurrently \"vite --mode development\" \"nodemon app.js\"" 命令行 npm run dev 运行 没有运行成功排查 …

vue2 bug 小白求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 具体流程: 页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 返回页面后页面没有刷新导致用户名还显示这 项目中没有用keep-alive缓存 也在设置了key 尝试了window.removeEventLi…

光学仪器镀膜上下料设备:智能化生产的引领者

当智能技术与制造业相融合,富唯智能镀膜上下料设备成为智能化生产的新引擎。它不仅将智能化、自动化理念融入到生产的各个环节,更为企业带来了生产效率的提升和成本的降低。 富唯智能镀膜上下料设备以其卓越的性能,在实现单面和两面镀膜的上料…