我手头有一个存储过程,存储过程很大,内容很多,运行了好久,大约一个多小时了,我也不知道是锁死了还是运行太慢东西太多,想求大神告知这种情况怎么定位存储运行到了那里,好进行处理!

解决方案 »

  1.   

    第一:这两个可以查看当前正在执行的sql
    (1)
    select a.program, b.spid, c.sql_text,c.SQL_ID  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.username is not null;
    (2)
    select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT
      from v$session a, v$sqlarea b 
    where a.sql_address = b.address 第二:检查死锁情况
    1)用dba用户执行以下语句,可以查看产生死锁的机器是哪一台
    select username,lockwait,status,machine,program from v$session where sid in
    (select session_id from v$locked_object)
    如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
    Username:死锁语句所用的数据库用户;
    Lockwait:死锁的状态,如果有内容表示被死锁。
    Status: 状态,active表示被死锁
    Machine: 死锁语句所在的机器。
    Program: 产生死锁的语句主要来自哪个应用程序。2)用dba用户执行以下语句,可以查看到被死锁的语句。
    select sql_text from v$sql where hash_value in 
    (select sql_hash_value from v$session where sid in
    (select session_id from v$locked_object))
      

  2.   

    如果有其他sql的话,可以在存储过程中加一些提醒或者输出语句,确定执行的进度;
    如果没有其他sql执行的话,可以直接查当前执行的sql语句确定存储过程执行的程度。
      

  3.   

    对啊,我就想知道这个程度,上面的那个sql是查询存储的执行状态的啊,没有执行程度