Oracle:查询当前正在等待执行的SQL语句
在Oracle数据库中,要查询当前正在等待执行的SQL语句,可以通过查询动态性能视图(Dynamic Performance Views)来实现。以下是几种常用的方法:
1. 查询正在等待的会话及其SQL语句
通过V$SESSION和V$SQL视图关联查询,可以获取正在等待的会话及其执行的SQL信息:
SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, s.prev_sql_id, q.sql_text, s.program, s.machine, s.logon_time
FROM v$session s
LEFT JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'INACTIVE' -- 筛选非活跃会话(即正在等待的会话)
AND s.type != 'BACKGROUND' -- 排除后台进程
AND s.sql_id IS NOT NULL;
2. 查看长时间等待的会话
使用V$SESSION_WAIT视图可以查看会话的等待事件信息,帮助定位资源争用问题4:
SELECT sid, serial#, event, wait_time, state, wait_class
FROM v$session_wait
WHERE wait_time > 0 -- 仅显示有等待时间的会话
ORDER BY wait_time DESC;
3. 查询当前用户正在等待的SQL
如果只想查看当前用户正在等待的SQL语句,可以使用以下查询:
SELECT a.sid, a.serial#, a.paddr, a.machine, nvl(a.sql_id, a.prev_sql_id) sql_id, b.sql_text
FROM v$session a, v$sql b
WHERE a.username = sys_context('USERENV', 'CURRENT_USER')
AND a.status = 'INACTIVE'
AND nvl(a.sql_id, a.prev_sql_id) = b.sql_id;
4. 查看等待事件类别汇总
通过V$SESSION_WAIT_CLASS视图可以查看会话在各个等待类别上的总等待时间,帮助快速定位主要资源等待类型:
SELECT sid, wait_class, time_waited
FROM v$session_wait_class
WHERE time_waited > 0
ORDER BY time_waited DESC;
关键字段说明
SID:会话标识符。
SERIAL#:会话序列号,与SID一起用于唯一标识一个会话。
SQL_ID:正在执行的SQL语句的唯一标识。
SQL_TEXT:SQL文本内容(可能被截断,完整内容需从V$SQLAREA获取)。
EVENT:会话当前正在等待的资源或事件名称(如“db file sequential read”、“buffer busy waits”等)。
