欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

存储过程执行时间过长如何掐掉

程序员文章站 2022-08-22 22:40:43
前文再续,说我最近被一存储过程折磨。 为啥说折磨呢。主要是很难调试。的强项不在于编码,存储过程写的过程比较别扭,其实运行起来更坑爹。出了问题,你很难知道是哪一部分引起的。如果这个存储过程执行的时间很...

前文再续,说我最近被一存储过程折磨。

为啥说折磨呢。主要是很难调试。的强项不在于编码,存储过程写的过程比较别扭,其实运行起来更坑爹。出了问题,你很难知道是哪一部分引起的。如果这个存储过程执行的时间很长,就更加痛苦了,是哪一部分慢嘛?

另外,由于执行时间长,实在等不下去,就想中途掐掉。要怎么搞?

--获得sid
select * from v$access where object='存储过程名';

--获得sid,serial#
select sid,serial#,lockwait,status,wait_time,state from v$session where sid='sid';

--杀掉进程
alter system kill session 'sid,serial#';

如果是存储过程托付给了job执行,要中途停掉job该如何处理呢?

--首先要关闭job计划
begin
  dbms_job.broken(job编号,true);
  commit;
end;

--检查job有没有正在运行,停止计划对它没有影响
--获得sid
select * from dba_jobs_running;

--获得sid,serial#
select sid,serial#,lockwait,status,wait_time,state from v$session where sid='sid';

--杀掉进程
alter system kill session 'sid,serial#';

有时候,存储过程甚至不能被编译,那么有可能是存储过程正在运行,或者其处理的表被锁定。有以下语句可供参考:

--存储过程无法编译
select v.osuser,  v.process, v.program,v.machine,v.terminal,
v.module,v.username,v.status, v.sid,v.serial#,
       'alter system kill session ''' || v.sid || ',' || v.serial# || ''';' as kill_session,
       v.paddr
  from v$session v
 where v.username like '%用户名%'
   and v.status in( 'inactive','active')
   and v.program = 'plsqldev.exe';

 select object_name, machine, s.sid, s.serial# ,s.status,
 'alter system kill session ''' || s.sid || ',' || s.serial# || ''';' as kill_session  
from gv$locked_object l, dba_objects o, gv$session s 
where l.object_id = o.object_id 
and l.session_id = s.sid;