需求描述:
这是一个工资计算模块 其中主要涉及到大量计算和操作数据库的是考勤
考勤相关表有:考勤表 标准表 我需要先从根据标准表和考勤表 计算出每个人一个月的出勤情况,包括迟到(迟到分为大概3种迟到根据迟到时间不同) 早退(也大概是3种) 忘打卡次数 而且考勤表里面的考勤记录一个人一天不一定有多少条 要筛选出有用的数据
请假和外出 是根据一个其他系统接口获取字符串 然后截取其中的数据 再计算出需要的数据
其中主要需要优化的地方应该是 for循环很多次 有几个循环800次的循环 还有就是查询了30左右各表每个的数据量应该在2000左右
我的功能就是通过查询各种表 计算出每个人的工资 然后写到另一个表中。 现在计算20个人的工资大概需要49秒。
希望大神给个优化思路,小弟对大量的计算和大量的数据这方面涉及太浅,求指点!
数据库性能优化需求
这是一个工资计算模块 其中主要涉及到大量计算和操作数据库的是考勤
考勤相关表有:考勤表 标准表 我需要先从根据标准表和考勤表 计算出每个人一个月的出勤情况,包括迟到(迟到分为大概3种迟到根据迟到时间不同) 早退(也大概是3种) 忘打卡次数 而且考勤表里面的考勤记录一个人一天不一定有多少条 要筛选出有用的数据
请假和外出 是根据一个其他系统接口获取字符串 然后截取其中的数据 再计算出需要的数据
其中主要需要优化的地方应该是 for循环很多次 有几个循环800次的循环 还有就是查询了30左右各表每个的数据量应该在2000左右
我的功能就是通过查询各种表 计算出每个人的工资 然后写到另一个表中。 现在计算20个人的工资大概需要49秒。
希望大神给个优化思路,小弟对大量的计算和大量的数据这方面涉及太浅,求指点!
数据库性能优化需求
你这样说的话,我只能提供你两个思路,一个是尽量减少对数据库的操作,二是是否可以采用多线程进行计算
你说的“从其他接口获取的字符串”这个处理难道是在计算考勤的时候才连接“其他系统”获取?
如果是这样的话,我觉得你的程序设计有问题,应该做个定时任务,每天凌晨(或者某个时刻)从“其他系统”获取考勤记录,进行处理(就是你说的字符串截取以及去除无效考勤记录),然后把真实有效的考勤结果用状态码记录在考勤表里
这样,在计算考勤的时候也就可以不再多次查询了。
当然,如果你由于种种限制不能做定时任务,也可以利用开启工资计算程序(C/S)或者打开工资计算页面(B/S)的时候,将上次计算之后至现在所有未进行数据处理的考勤记录都处理一遍。也能起到这样的效果
所谓下推数据库,就是建议用 聚合函数 甚至存储过程,总的来说就是SQL语句来完成主体计算过程,降低网路传输等开销。任务化,就是不要将这些操作做成是实时由用户触发的;而是用户只能要求启动(或定时启动)该任务,后台计算完毕后,再通知用户来查询任务执行的结果。那么就可以晚上执行,白天看结果。