在 Oracle 数据库中是否有可能显示其他进程的进度?类似于 Sybase 的 sp_who
命令。
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_WHO提供的更多信息。
在查看sp_who之后,Oracle本身没有这种能力。 Oracle至少有8个运行中的进程来运行数据库,例如RMON等。
你可以询问DB正在运行哪些查询,因为那只是一个表查询。 查看V$表格。
快速示例:
SELECT sid,
opname,
sofar,
totalwork,
units,
elapsed_seconds,
time_remaining
FROM v$session_longops
WHERE sofar != totalwork;
这段代码显示当前处于“ACTIVE”状态的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
/
请注意,数据库中可能存在一些当前不支持会话的进程。
如果您对所有进程感兴趣,您可以查看v$process(或在RAC上查看gv$process)。
sql.elapsed_time / 1000000
,并加上约束条件WHERE ... AND sql.elapsed_time IS NOT NULL
,最后通过ORDER BY sql.elapsed_time DESC
进行排序。 - Maxime Pacary