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

AI 概述
1. 查询动态性能视图(1) 查看当前活跃会话及其执行的 SQL(2) 查看长时间运行的 SQL 操作2. 查询 SQL 执行详细信息(1) 通过 v$sqlarea 查看完整的 SQL 文本(2) 查看 SQL 执行计划3. 使用 Oracle Enterprise Manager (OEM)4. 使用 Active Session History (ASH)快速定位问题 SQL 在 Oracle 数据库中,要...
目录
文章目录隐藏
  1. 1. 查询动态性能视图
  2. 2. 查询 SQL 执行详细信息
  3. 3. 使用 Oracle Enterprise Manager (OEM)
  4. 4. 使用 Active Session History (ASH)
  5. 快速定位问题 SQL

Oracle 怎么查看后台正在执行的 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;

关键字段

  • sql_id:当前正在执行的 SQL 语句的唯一标识。
  • sql_text:SQL 文本内容(可能被截断,完整内容需从 v$sqlarea 获取)。
  • username:执行 SQL 的数据库用户。
  • program:发起 SQL 的客户端程序(如 JDBC、SQL Developer 等)。

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

(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#(如果是并行操作)。

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

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 语句执行过程中从数据库缓冲区缓存中获取的数据块数量。高数值可能表明该语句对系统资源有较高需求。

通过 v$sqlarea 查看完整的 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 语句呢?(最新推荐)的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

0

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » Oracle 怎么查看后台正在执行的 SQL 语句呢?(最新推荐)

发表回复