Oracle:查询当前正在等待执行的SQL语句

在Oracle数据库中,要查询当前正在等待执行的SQL语句,可以通过查询动态性能视图(Dynamic Performance Views)来实现。以下是几种常用的方法:

  1. 查询正在等待的会话及其SQL语句

通过VSESSION和VSQL视图关联查询,可以获取正在等待的会话及其执行的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;

  1. 查看长时间等待的会话

使用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;

  1. 查询当前用户正在等待的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 vsession a, vsql 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;

  1. 查看等待事件类别汇总

通过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"等)‌。

相关推荐
不像程序员的程序媛5 小时前
系统cpu内存负载资源分析
运维·服务器·数据库
Jane Chiu6 小时前
Oracle DBMS_REDEFINITION(在线重定义)
数据库·oracle·分区表
全栈前端老曹7 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
怕孤单的草丛7 小时前
缓存管理面临的主要问题
java·数据库·缓存
Uncertainty!!7 小时前
Ubuntu 22.04 安装超好用中文输入法rime-ice(雾凇拼音)过程记录
linux·ubuntu·中文输入法
我会尽全力 乐观而坚强8 小时前
MySQL零基础入门(二)
数据库·mysql·adb
ShineWinsu8 小时前
对于Linux:网络基础的解析
linux·网络·面试·udp·笔试·ip·tcp
kali-Myon9 小时前
某校园门禁系统高危 SQL 注入漏洞挖掘复盘
数据库·sql·安全·web安全
↘"LYong9 小时前
旧版 CentOS 安装 Docker 完整指南(附国内镜像加速)
linux·运维·docker