需求描述:
        这是一个工资计算模块  其中主要涉及到大量计算和操作数据库的是考勤
     考勤相关表有:考勤表   标准表  我需要先从根据标准表和考勤表 计算出每个人一个月的出勤情况,包括迟到(迟到分为大概3种迟到根据迟到时间不同)  早退(也大概是3种) 忘打卡次数  而且考勤表里面的考勤记录一个人一天不一定有多少条 要筛选出有用的数据
     请假和外出 是根据一个其他系统接口获取字符串  然后截取其中的数据  再计算出需要的数据
     其中主要需要优化的地方应该是 for循环很多次  有几个循环800次的循环   还有就是查询了30左右各表每个的数据量应该在2000左右  
     我的功能就是通过查询各种表 计算出每个人的工资  然后写到另一个表中。 现在计算20个人的工资大概需要49秒。
    希望大神给个优化思路,小弟对大量的计算和大量的数据这方面涉及太浅,求指点!     
数据库性能优化需求

解决方案 »

  1.   

    最好把你相关的sql语句,相关的计算处理方法贴出来
    你这样说的话,我只能提供你两个思路,一个是尽量减少对数据库的操作,二是是否可以采用多线程进行计算
      

  2.   

    能说一下你的sql语句和表结构么?
    你说的“从其他接口获取的字符串”这个处理难道是在计算考勤的时候才连接“其他系统”获取?
    如果是这样的话,我觉得你的程序设计有问题,应该做个定时任务,每天凌晨(或者某个时刻)从“其他系统”获取考勤记录,进行处理(就是你说的字符串截取以及去除无效考勤记录),然后把真实有效的考勤结果用状态码记录在考勤表里
    这样,在计算考勤的时候也就可以不再多次查询了。
    当然,如果你由于种种限制不能做定时任务,也可以利用开启工资计算程序(C/S)或者打开工资计算页面(B/S)的时候,将上次计算之后至现在所有未进行数据处理的考勤记录都处理一遍。也能起到这样的效果
      

  3.   


    所谓下推数据库,就是建议用 聚合函数 甚至存储过程,总的来说就是SQL语句来完成主体计算过程,降低网路传输等开销。任务化,就是不要将这些操作做成是实时由用户触发的;而是用户只能要求启动(或定时启动)该任务,后台计算完毕后,再通知用户来查询任务执行的结果。那么就可以晚上执行,白天看结果。