oracle12c 一个存储过程放job中执行效率超级慢,plsql执行很快

linkheart 2017-09-27 11:47:23
oracle的一个存储过程放在job中自动执行效率很慢,几秒钟处理一条记录,如果放到plsql中或者sqlplus中去执行速度很快,1万条记录大约在20秒钟;
数据库时oracle12c,rac环境,两个节点,服务器内存有32g,cpu多核心的,服务器及配置上应该没有问题,没有死锁,open_cursor设置为1000,配置如下:




我需要每分钟执行一次这个存储过程,但是现在每次执行都需要好长时间,处理的数据量也不是很大。
系统在oracle10g/11g下面都很正常,就是12c的rac环境下这样,实在是不知道什么原因。
哪位高人指点下,不胜感激。
...全文
1388 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmsr1860 2021-07-11
  • 打赏
  • 举报
回复

请问后来怎样解决了吗?我被同样的问题困扰,环境是12.1 RAC,PDB方式。我看你的过程里也是存储过程里调用了自定义package里的存储过程,这个也和我类似。

sz_jack 2017-10-22
  • 打赏
  • 举报
回复
id 有索引没有,加个索引看看! base_customers 查询慢步 ,和 pkg_rec_cust_acc.processconsumerec 又是什么过程, FOR UPDATE OF 不用可以不,加个日志运行记录临时表分段记录记录时间为毫秒,看看运行到哪个代码段慢了,就分析一下!
「已注销」 2017-10-01
  • 打赏
  • 举报
回复
一分钟执行一次为什么还要一条条记录执行,直接一批执行不就好啦?而且你这种没加监控时间,你自己都不知道你这个sql执行那一步比较慢
碧水幽幽泉 2017-09-28
  • 打赏
  • 举报
回复
发下你存储过程,看下代码如何?
碧水幽幽泉 2017-09-28
  • 打赏
  • 举报
回复
内存32g有点少哦,一般都在128g以上~
linkheart 2017-09-28
  • 打赏
  • 举报
回复
内存好像是96g,足够用了
linkheart 2017-09-28
  • 打赏
  • 举报
回复
PROCEDURE autoprocuploadconsumerec AS out_msg VARCHAR2 (1000); out_result NUMBER; vplanstoptime VARCHAR2 (128); vcount NUMBER; visbalance NUMBER; n_opcount NUMBER; n_oddfare NUMBER; n_subopcount NUMBER; n_suboddfare NUMBER; CURSOR c1 IS SELECT * FROM ( SELECT * FROM t_xfjla ORDER BY a.id) WHERE ROWNUM < 800; BEGIN out_msg := ''; dbms_output.put_line( 'START PROCESS _CONSUME'|| to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') ); FOR c1_rec IN c1 LOOP SELECT NVL (COUNT (*), 0) INTO vcount FROM base_customers a WHERE a.customerid = c1_rec.customerid AND a.dpid = c1_rec.dpid; --如果为正式账户,则锁住base_customers表中的行 IF vcount > 0 THEN SELECT a.opcount, a.oddfare, a.subopcount, a.suboddfare INTO n_opcount, n_oddfare, n_subopcount, n_suboddfare FROM base_customers a WHERE a.customerid = c1_rec.customerid AND a.dpid = c1_rec.dpid FOR UPDATE OF a.opcount, a.oddfare, a.subopcount, a.suboddfare skip locked ; END IF; SELECT NVL (COUNT (*), 0) INTO vcount FROM rec_writeoff a WHERE a.customerid = c1_rec.customerid AND a.dpid = c1_rec.dpid; pkg_rec_cust_acc.processconsumerec (c1_rec.customerid, out_msg, out_result); --记录处理成功,删除上传记录 DELETE rec_upload_consume WHERE id = c1_rec.id; dbms_output.put_line( 'END PROCESS REC_UPLOAD_CONSUME'|| to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') ); COMMIT; END LOOP; EXCEPTION WHEN OTHERS THEN ROLLBACK; out_msg := out_result || '_' || out_msg || '_' || SQLERRM; out_result := -1; dbms_output.put_line( 'proceupdateoldflag' || OUT_MSG || to_char(SYSTIMESTAMP,'yy-mm-dd hh24:mi:ss:ff3') ); END; 我用的exec dbms_scheduler做的job自动1分钟执行一次,目前每次总超过1分钟,plsql中执行速度很快
jdsnhan 2017-09-28
  • 打赏
  • 举报
回复
job执行的时候,看看有没有锁,看看v$session_wait有什么等待事件

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧