打对了

实践Oracle优化技术在医疗信息化中的深入应用,探索医院信息系统性能优化设计之道。公众号:医信系统性能优化。

 

使用这个过程就可以看到谁在执行一个存储过程

使用这个过程就可以看到谁在执行一个存储过程

create or replace procedure sys.who_is_using(obj_name varchar2) is
begin
dbms_output.enable(1000000);
   for i in (SELECT distinct b.username,b.sid
             FROM SYS.x$kglpn a,v$session b,SYS.x$kglob c
             WHERE a.KGLPNUSE = b.saddr
               and upper(c.KGLNAOBJ)  like upper(OBJ_NAME)
               and a.KGLPNHDL = c.KGLHDADR)
               loop
   dbms_output.put_line('('||to_char(i.sid)||') - '||i.username);
   end loop;
end;


如果该存储过程有读写数据的话,你可以用strace -p 进程号
看是不是有很多数据在读写,solaris用truss

查找进程号和SQL语句可以用
select a.program,
       a.machine,
       b.spid,  --进程号
       c.sql_text,
       a.status
  from v$session a,
       v$process b,
       v$sqlarea c
where a.paddr=b.addr
   and a.sql_hash_value=c.hash_value
   and a.sql_address=c.address
   and a.sid = ???;
--正在运行的语句

select a.program,
       a.machine,
       a.sid,
       c.sql_text,
       to_char(a.LOGON_TIME,'yyyy-mm-dd hh24:mi:ss')
  from v$session a,
       v$process b,
       v$sqlarea c
where a.paddr=b.addr
   and a.PREV_HASH_VALUE=c.hash_value
   and a.PREV_SQL_ADDR=c.address
   and a.sid = ???;
--已经运行完的语句


你也可以用
select TIME_REMAINING,ELAPSED_SECONDS from v$session_longops  where sid =???
看看TIME_REMAINING是什么值

select count(*)  into vn_number
       from SYS.V_$ACCESS a,SYS.V_$session b where a.type='PROCEDURE'
           and a.OBJECT like 存储过程名称'  and a.sid=b.sid and b.status='ACTIVE';--判断当前存储过程是否正在运行!

posted on 2005-01-26 00:23  知道得越多知道的越少  阅读(613)  评论(0)    收藏  举报

导航