Loading

oracle json()函数put优化案例

数据库版本:12.1.0.2

服务器操作系统:rhl

某erp模块业务反馈最近执行很慢,之前执行时间十几秒钟,现在执行时间三四天无法跑完,相关执行时间截图如下,需要介入进行排查问题

 

 

 

 

 

 

 

 

 

 

 

 

 

通过分析数据库执行plsql对应等待事件,发现都是单块读,且每个单块读持续的时间较长,这里发现对应的p1.p2.p3持续时间几十秒,起初怀疑是对应的表的问题。通过对应的p1,p2,p3找到了具体的对应,并对对象进行了分析,没有发现问题(行迁移、行链接)

 针对时间段做了一个ash报告,从top pl/sql procedures发现存储过程在json.put的时候比较慢

json代码结构如下,懂开发的同事建议将l_lotline_json:= json();写入到第二层嵌套中,相当于新建一个对象。经过测试原本几天不能执行完毕的SQL,恢复正常,这里就有疑问为啥之前跑的时候没有问题,修改后就恢复正常了???

询问开发的同学,按照java的理论新建一个对象消耗的时间更多,如果把l_lotline_json:= json()如下二层嵌套中,每次就需要新建一个对象,不需要put覆盖之前的数据。但在Oracle实际执行过程中确确实实是因为put覆盖对象导致的业务延迟,不太懂,先做下记录吧。

 

FOR rec_mmt IN csr_mmt LOOP
l_lotline_json := json(); 这里的代码替换到了下层循环中
l_lotline_jsonlist := json_list();
--LOT
FOR rec_lot IN csr_lot(p_wms_transaction_id => rec_mmt.wms_transaction_id) LOOP
l_lotline_json.put('wms_transaction_id',
rec_lot.wms_transaction_id);
l_lotline_json.put('lot_number', rec_lot.lot_number);
l_lotline_json.put('transaction_quantity',
l_header_json.put('transaction_date',
to_char(rec_lot.transaction_date,
'YYYY-MM-DD HH24:MI:SS'));
l_lotline_jsonlist.append(l_lotline_json.to_json_value);
END LOOP;

 

posted @ 2022-05-13 11:12  李行行  阅读(327)  评论(0编辑  收藏  举报