項目中比較棘手的性能問題解決:
基礎數據:
病案首頁數據 20萬*12 約等于 2000萬
費用信息:20*8*12? 約等于1.6億.
診斷信息:20*2*12
手術信息? 10*12?
性能要求 :抽數自娩、質控加分組兩個小時同云。
實際跑出來:8個小時沒跑完。
定位問題:查詢oracle正在執(zhí)行的sql和執(zhí)行耗時最長的sql定位到存儲過程中一條sql充易。
分析原因:
? 1.查詢臨時表空間、表空間資源情況是否用完
? 2.查詢undo、redo資源
? 3.查詢cpu 。
? 4.分析awr報告
最終定位到:cpu在運算時達到90%以上鞍历,awr顯示大量的IO等待。
經過分析最終敲定是因為該條sql導致IO過重肪虎,因為該條sql采用update加子查詢的形式劣砍,子查詢中做做了大量的運算。
初步解決性能問題:
? 因為項目驗收時間緊迫扇救,所以做了個初步方案刑枝。
? update語句拆分,通過oracle中的游標進行循環(huán)更新迅腔,把能夠合并的更新邏輯装畅,在遍歷游標時合并更新,最終勉強達到性能要求沧烈。
最終解決方案:
? 廢棄質控對應的存儲過程掠兄,質控邏輯在代碼中實現,建立質控規(guī)則庫锌雀,通過drools規(guī)則引擎去校驗每條病案數據違反了哪條質控規(guī)則蚂夕,每次質控完成放入隊列,
? 重新開一個線程去隊列中獲取質控后的病案進行分組腋逆。
? 這樣做的好處:
? 第一:通過規(guī)則引擎技術婿牍,可以隨意添加質控規(guī)則,只需維護規(guī)則腳本即可惩歉,實現代碼質控規(guī)則的解耦合等脂,原來的質控規(guī)則是通過sql運算出來的,每次新增規(guī)則撑蚌,需要改sql上遥,sql可讀性也很差,
? 該起來也費勁锨并。
? 第二:規(guī)則引擎是在內存中計算露该,提高了質控的性能標準睬棚。
? 第二:通過異步編程第煮,運用java隊列,質控一條病案就立即去分組抑党,改善代碼性能包警。
--?中華石杉面試要點
https://gitee.com/shishan100/Java-Interview-Advanced