Oracle 查看后台正在执行的 SQL 语句

06-01 116阅读

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

          Oracle 查看后台正在执行的 SQL 语句

          (2) 查看 SQL 执行计划

          通过 v$sql_plan 分析 SQL 的执行计划:

          SELECT 
              * 
          FROM 
              v$sql_plan 
          WHERE 
              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_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语句的整体执行效率。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码