【发布时间】:2010-09-17 00:04:59
【问题描述】:
是否可以显示 Oracle 数据库上正在进行的其他进程?像 Sybases sp_who
【问题讨论】:
是否可以显示 Oracle 数据库上正在进行的其他进程?像 Sybases sp_who
【问题讨论】:
这个显示的是当前“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)
【讨论】:
查看 sp_who 后,Oracle 本身并没有这种能力。 Oracle 至少有 8 个运行 db 的进程在运行。像 RMON 等。
您可以询问数据库正在运行哪些查询,因为这只是一个表查询。查看 V$ 表。
快速示例:
SELECT sid,
opname,
sofar,
totalwork,
units,
elapsed_seconds,
time_remaining
FROM v$session_longops
WHERE sofar != totalwork;
【讨论】:
我怀疑您只想从 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_WHO 提供的更多信息。
【讨论】:
SELECT中添加sql.elapsed_time / 1000000,加上约束WHERE ... AND sql.elapsed_time IS NOT NULL,最后是ORDER BY sql.elapsed_time DESC。