欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

Oracle 查看后台正在执行的 SQL 语句(最新推荐)

2025年07月16日 MsSqlserver
在 oracle 数据库中,要查看后台正在执行的 sql 语句,可以通过查询动态性能视图(dynamic performance views)或使用监控工具来实现。1. 查询动态性能视图(1) 查看当

在 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_secelapsed_time 字段表示sql语句执行所花费的总时间(微秒),通过除以1,000,000转换为秒,并将其重命名为 elapsed_sec 以便更直观地理解时间单位。
  • cpu_time / 1000000 as cpu_seccpu_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 执行:

  1. 登录 oem 控制台。

  2. 导航到 performance > sql monitoring

  3. 查看实时 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_seccpu_time 字段表示sql语句执行期间消耗的cpu时间(微秒)。通过除以1,000,000将时间单位转换为秒,并将其重命名为 cpu_sec 以便更直观地理解时间单位。这有助于评估sql语句对cpu资源的占用情况。
  • elapsed_time / 1000000 as elapsed_secelapsed_time 字段表示sql语句执行所花费的总时间(微秒),通过除以1,000,000转换为秒,并将其重命名为 elapsed_sec。它包括等待时间和执行时间,可用于评估sql语句的整体执行效率。

到此这篇关于oracle 查看后台正在执行的 sql 语句的文章就介绍到这了,更多相关oracle查询正在执行的sql内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!