oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > oracle查询正在执行的sql

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

作者:愿与狸花过一生

本文给大家介绍了Oracle中查看后台SQL的多种方法,包括查询动态性能视图(如v$session、v$sqlarea)、使用监控工具(如OEM)及ASH,通过SQL_ID、执行计划和资源消耗等字段分析SQL性能与执行状态,感兴趣的朋友一起看看吧

在 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;

(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;  -- 仅显示未完成的操作

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

(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;

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

您可能感兴趣的文章:
阅读全文