代码之家  ›  专栏  ›  技术社区  ›  Robert Brown

如何在Oracle数据库中显示正在运行的进程?

  •  58
  • Robert Brown  · 技术社区  · 16 年前

    是否可以在Oracle数据库上显示其他正在进行的进程?有点像Sybase sp_who

    4 回复  |  直到 11 年前
        1
  •  80
  •   Justin Cave    16 年前

    我怀疑您只想从v$session中获取一些列,从v$sql中获取SQL语句。假设您希望排除Oracle本身正在运行的后台进程

    SELECT sess.process, sess.status, sess.username, sess.schemaname, sql.sql_text
      FROM v$session sess,
           v$sql     sql
     WHERE sql.sql_id(+) = sess.sql_id
       AND sess.type     = 'USER'
    

    外部联接是处理那些当前不活动的会话,假设您需要这些会话。您还可以从v$sql中获取sql_fulltext列,该列将包含完整的sql语句,而不是前1000个字符,但这是一个CLOB,因此处理起来可能更复杂一些。

    实际上,您可能希望查看v$session中提供的所有信息,因为您可能比提供的sp_获得更多信息。

        2
  •  5
  •   Pieter van Niekerk    14 年前

    在查看了sp_who之后,Oracle本身就没有这种能力。Oracle至少有8个运行数据库的进程。像RMON等。

    您可以向数据库询问哪些查询作为表查询运行。看看V$表。

    快速实例:

    SELECT sid,
           opname,
           sofar,
           totalwork,
           units,
           elapsed_seconds,
           time_remaining
    FROM v$session_longops
    WHERE sofar != totalwork;
    
        3
  •  4
  •   WW.    11 年前

    此项显示当前处于“活动”状态的SQL:-

    select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
    from v$sqltext_with_newlines t,V$SESSION s
    where t.address =s.sql_address
    and t.hash_value = s.sql_hash_value
    and s.status = 'ACTIVE'
    and s.username <> 'SYSTEM'
    order by s.sid,t.piece
    /
    

    这显示锁。有时事情进展缓慢,但这是因为它在等待锁时受阻:

    select
      object_name, 
      object_type, 
      session_id, 
      type,         -- Type or system/user lock
      lmode,        -- lock mode in which session holds lock
      request, 
      block, 
      ctime         -- Time since current mode was granted
    from
      v$locked_object, all_objects, v$lock
    where
      v$locked_object.object_id = all_objects.object_id AND
      v$lock.id1 = all_objects.object_id AND
      v$lock.sid = v$locked_object.session_id
    order by
      session_id, ctime desc, object_name
    /
    

    这对于查找长操作(如全表扫描)是一个很好的方法。如果是因为很多短时间的操作,什么也不会出现。

    COLUMN percent FORMAT 999.99 
    
    SELECT sid, to_char(start_time,'hh24:mi:ss') stime, 
    message,( sofar/totalwork)* 100 percent 
    FROM v$session_longops
    WHERE sofar/totalwork < 1
    /
    
        4
  •  1
  •   Ryan    12 年前

    请记住,数据库上有一些进程当前可能不支持会话。

    如果您对所有进程都感兴趣,您将希望查看v$process(或rac上的gv$process)