项目中比较棘手的性能问题解决:
基础数据:
病案首页数据 20万*12 约等于 2000万
费用信息:20*8*12 约等于1.6亿.
诊断信息:20*2*12
手术信息 10*12
性能要求 :抽数、质控加分组两个小时。
实际跑出来:8个小时没跑完。
定位问题:查询oracle正在执行的sql和执行耗时最长的sql定位到存储过程中一条sql。
分析原因:
1.查询临时表空间、表空间资源情况是否用完
2.查询undo、redo资源
3.查询cpu 。
4.分析awr报告
最终定位到:cpu在运算时达到90%以上,awr显示大量的IO等待。
经过分析最终敲定是因为该条sql导致IO过重,因为该条sql采用update加子查询的形式,子查询中做做了大量的运算。
初步解决性能问题:
因为项目验收时间紧迫,所以做了个初步方案。
update语句拆分,通过oracle中的游标进行循环更新,把能够合并的更新逻辑,在遍历游标时合并更新,最终勉强达到性能要求。
最终解决方案:
废弃质控对应的存储过程,质控逻辑在代码中实现,建立质控规则库,通过drools规则引擎去校验每条病案数据违反了哪条质控规则,每次质控完成放入队列,
重新开一个线程去队列中获取质控后的病案进行分组。
这样做的好处:
第一:通过规则引擎技术,可以随意添加质控规则,只需维护规则脚本即可,实现代码质控规则的解耦合,原来的质控规则是通过sql运算出来的,每次新增规则,需要改sql,sql可读性也很差,
该起来也费劲。
第二:规则引擎是在内存中计算,提高了质控的性能标准。
第二:通过异步编程,运用java队列,质控一条病案就立即去分组,改善代码性能。
-- 中华石杉面试要点
https://gitee.com/shishan100/Java-Interview-Advanced
网友评论