12月20日的结息程序在今天晚上就要进行,近段时间一直在对其运行程序进行优化处理
贷款结息分成几个部分:
一、1321应收未收利息,107,108科目的复利计算
二、贷款本金的利息计算
三、本次结息后付息账号余额超出部分,要计提1321应收利息处理
优化前的问题:结息速度太慢,在9月20日的结息过程中,需要结息的贷款户大概为90,000户,整个结息时间花了足足13个小时,本季度结息包含的账户有按月付、月付+还付、季付、季付+还付、利随本清五类,一共大概270,000户,在12月20日这一天计算机要处理的工作比较多:对公结息、储蓄结息、对公计提、储蓄计提、贷款结息,所以要求贷款结息必须在3 到4 个小时(已经分配的算足够多的了)内处理完毕
原程序的设计:LNRECD为贷款分户表,CUINTS为账户利息表,LNRETU为贷款交易登记表
1.遍历LNRECD表,逐条计算出利息放入到CUINTS表中,利息 = ( 本金 x 利率 x 天数 ) / 30000
2.遍历CUINTS,逐条选择LNRECD贷款账户,在遍历对应LNRETU记录,对前期的应收未收利息进行复利计算并加入到本次结息金额中
3.对每个结息贷款户进行付息账户的账户处理,如果其对应的1321,107,108 科目账户不存在则自动开设
4.生成结息报表
优化方案:
1.分成多进程运行,按照联社分组同时处理,暂时设计6 个进程
2.对不正确的贷款分户进行处理,比如需要结息却没有对应的付息账号,处理办法:此户改为不结息或者维护正确的付息账号
3.在12月19日把对应的1321,107,108 科目账户开设号,以便在结息中省去开设账户的过程
4.优化程序中的sql语句,使用索引,此过程使用ORACLE Client提供的图形界面sql语句执行板块进行,针对每条语句都有运行时间可以参考,有的语句稍微修改可以提高一个数量级的运行时间
5.建立LNRETU_TMP表,结息中的还息记录将插入此临时表,运行完成后再导回原LNRETU表
6.新建立LNRETU的index,根据其中一条查询语句字段建立