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;
作者:hanglinux
出处:https://www.cnblogs.com/hanglinux/p/16265906.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
优化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-05-13 安装cvuqdisk-1.0.9-1.rpm报错