在 oracle 数据库中,要查看后台正在执行的 sql 语句,可以通过查询动态性能视图(dynamic performance views)或使用监控工具来实现。
1. 查询动态性能视图
(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 = 'active' -- 筛选活跃会话 and s.type != 'background' -- 排除后台进程 and s.sql_id is not null;
关键字段:
sql_id
:当前正在执行的 sql 语句的唯一标识。sql_text
:sql 文本内容(可能被截断,完整内容需从v$sqlarea
获取)。username
:执行 sql 的数据库用户。program
:发起 sql 的客户端程序(如 jdbc、sql developer 等)。
(2) 查看长时间运行的 sql 操作
使用 v$session_longops
监控长时间运行的操作(如全表扫描、索引重建等)
select sid, serial#, opname, target, sofar, totalwork, round(sofar / totalwork * 100, 2) as progress_pct, elapsed_seconds, time_remaining from v$session_longops where time_remaining > 0; -- 仅显示未完成的操作
sid
: 会话标识符。serial#
: 会话序列号,与 sid 一起用于唯一标识一个会话。opname
: 正在执行的操作名称。target
: 操作目标对象名(如果适用)。target_desc
: 目标描述。sofar
: 到目前为止已完成的工作量。totalwork
: 预估的总工作量。units
: 工作量单位。start_time
: 操作开始的时间。last_update_time
: 上次更新此记录的时间。time_remaining
: 根据当前速度预估剩余时间(秒)。elapsed_seconds
: 自操作开始以来已经过去的秒数。context
: 内部使用的上下文信息。message
: 描述操作状态的消息。username
: 执行该操作的用户名。sql_address
: sql 语句地址。sql_hash_value
: sql 语句的哈希值。sql_id
: sql 语句的 id。sql_plan_hash_value
: sql 计划的哈希值。qcinst_id
: 并行查询协调器实例 id(如果是并行操作)。qcsid
: 并行查询协调器的 sid(如果是并行操作)。qcserial#
: 并行查询协调器的 serial#(如果是并行操作)。
2. 查询 sql 执行详细信息
(1) 通过 v$sqlarea 查看完整的 sql 文本
select sql_id, sql_text, executions, elapsed_time / 1000000 as elapsed_sec, cpu_time / 1000000 as cpu_sec, disk_reads, buffer_gets from v$sqlarea where sql_id = '<your_sql_id>'; -- 替换为实际的 sql_id
sql_id
: 每条sql语句在数据库中的唯一标识符。这个id可以帮助你识别和追踪特定的sql语句。sql_text
: 这是完整的sql语句文本。它显示了实际被执行的sql语句内容。executions
: 表示这条sql语句已经被执行了多少次。每次执行都会增加这个计数器。elapsed_time / 1000000 as elapsed_sec
:elapsed_time
字段表示sql语句执行所花费的总时间(微秒),通过除以1,000,000转换为秒,并将其重命名为elapsed_sec
以便更直观地理解时间单位。cpu_time / 1000000 as cpu_sec
:cpu_time
字段表示sql语句执行期间消耗的cpu时间(微秒),同样通过除以1,000,000转换为秒,并将其重命名为cpu_sec
。disk_reads
: 这个字段表示sql语句执行过程中发生的物理读取次数,即从磁盘读取数据的次数。较高的值可能指示性能瓶颈。buffer_gets
: 表示逻辑读的数量,即sql语句执行过程中从数据库缓冲区缓存中获取的数据块数量。高数值可能表明该语句对系统资源有较高需求。
(2) 查看 sql 执行计划
通过 v$sql_plan
分析 sql 的执行计划:
select * from v$sql_plan where sql_id = '<your_sql_id>';
3. 使用 oracle enterprise manager (oem)
oracle 提供的图形化工具 enterprise manager (oem) 可以直观监控 sql 执行:
登录 oem 控制台。
导航到 performance > sql monitoring。
查看实时 sql 执行的详细信息,包括资源消耗、执行计划等。
4. 使用 active session history (ash)
通过 v$active_session_history
查询历史活动会话信息(采样频率为每秒一次):
select sql_id, session_id, session_serial#, sample_time, event, wait_time from v$active_session_history where sql_id is not null order by sample_time desc;
快速定位问题 sql
-- 查看消耗最多 cpu 的 sql select sql_id, sql_text, executions, cpu_time / 1000000 as cpu_sec, elapsed_time / 1000000 as elapsed_sec from v$sqlarea order by cpu_time desc fetch first 10 rows only;
sql_id
: 每条sql语句在数据库中的唯一标识符。通过这个id可以追踪和分析特定的sql语句。sql_text
: 这是sql语句的实际文本内容,显示了被执行的sql语句的具体内容。executions
: 表示这条sql语句已经被执行了多少次。每次执行都会增加这个计数器,可以帮助你了解该语句的使用频率。cpu_time / 1000000 as cpu_sec
:cpu_time
字段表示sql语句执行期间消耗的cpu时间(微秒)。通过除以1,000,000将时间单位转换为秒,并将其重命名为cpu_sec
以便更直观地理解时间单位。这有助于评估sql语句对cpu资源的占用情况。elapsed_time / 1000000 as elapsed_sec
:elapsed_time
字段表示sql语句执行所花费的总时间(微秒),通过除以1,000,000转换为秒,并将其重命名为elapsed_sec
。它包括等待时间和执行时间,可用于评估sql语句的整体执行效率。
到此这篇关于oracle 查看后台正在执行的 sql 语句的文章就介绍到这了,更多相关oracle查询正在执行的sql内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!