4. 联合使用示例
(1) 查看所有会话及其关联的进程信息
SELECT
s.SID, s.SERIAL#, s.USERNAME, s.STATUS, s.SQL_ID,
p.PID, p.SPID, p.PGA_USED_MEM
FROM
V$SESSION s
JOIN
V$PROCESS p ON s.PADDR = p.ADDR
WHERE
s.USERNAME IS NOT NULL; -- 过滤后台会话
输出字段解释:
SPID:操作系统进程 ID(可用于 top -p <SPID> 或 ps -ef 监控)。
PGA_USED_MEM:进程内存使用量,单位为字节。
(2) 查找消耗 CPU 或内存最高的会话
SELECT
s.SID, s.USERNAME, s.SQL_ID,
p.SPID,
ROUND(p.PGA_USED_MEM/1024/1024, 2) AS PGA_MB,
s.LOGON_TIME, s.MACHINE, s.PROGRAM
FROM
V$SESSION s
JOIN
V$PROCESS p ON s.PADDR = p.ADDR
ORDER BY
p.PGA_USED_MEM DESC;
(3) 定位长时间未提交的事务
SELECT
s.SID, s.SERIAL#, s.USERNAME,
t.START_TIME, t.USED_UBLK AS Undo_Blocks,
s.SQL_ID, s.MACHINE, s.PROGRAM
FROM
V$SESSION s
JOIN
V$TRANSACTION t ON s.TADDR = t.ADDR
WHERE
s.USERNAME IS NOT NULL;
(4) 终止指定会话
-- 根据 SID 和 SERIAL# 终止会话
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';
5. 高级分析技巧
(1) 结合 V$SQL 分析 SQL 性能
通过 V$SESSION.SQL_ID 关联 V$SQL,获取 SQL 的完整文本和执行计划:
SELECT
s.SID, s.SQL_ID,
q.SQL_TEXT, q.EXECUTIONS, q.ELAPSED_TIME
FROM
V$SESSION s
JOIN
V$SQL q ON s.SQL_ID = q.SQL_ID
WHERE
s.STATUS = 'ACTIVE';
(2) 分析会话等待事件
查看会话的等待事件,定位 I/O、锁等问题:
SELECT
SID, EVENT, STATE, WAIT_TIME, SECONDS_IN_WAIT
FROM
V$SESSION_WAIT
WHERE
SID IN (SELECT SID FROM V$SESSION WHERE STATUS = 'ACTIVE');
(3) 跟踪操作系统进程
通过 SPID 使用操作系统工具(如 strace、perf)跟踪进程行为: