Oracle SQL Monitoring(实时 SQL 监控)

Oracle SQL Monitoring(实时 SQL 监控)

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

SQL Monitoring 实时监控 SQL 执行[1]:

特性

  • 自动监控并行 SQL
  • 自动监控执行 > 5 秒的 SQL
  • 实时进度
  • 详细统计

2. 查看

2.1 v$sql_monitor

SELECT 
  sql_id,
  status,
  elapsed_time / 1000000 AS elapsed_sec,
  cpu_time / 1000000 AS cpu_sec,
  buffer_gets,
  disk_reads,
  process_name
FROM v$sql_monitor
ORDER BY elapsed_time DESC;

2.2 v$sql_plan_monitor

SELECT 
  sql_id,
  plan_line_id,
  plan_operation,
  plan_options,
  starts,
  output_rows,
  buffer_gets,
  elapsed_time / 1000000 AS elapsed_sec
FROM v$sql_plan_monitor
WHERE sql_id = '&sql_id'
ORDER BY plan_line_id;

3. 报告

3.1 文本报告

SET LONG 100000
SET LONGCHUNKSIZE 100000
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => '&sql_id') FROM dual;

3.2 HTML 报告

SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
  sql_id => '&sql_id',
  type => 'HTML'
) FROM dual;

3.3 Active 报告

SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR_LIST(
  type => 'ACTIVE',
  sql_top_n => 10
) FROM dual;

4. 强制监控

4.1 HINT

SELECT /*+ MONITOR */ * FROM big_table WHERE ...;
SELECT /*+ NO_MONITOR */ * FROM small_table WHERE ...;

4.2 参数

ALTER SYSTEM SET sql_monitor = TRUE;

5. 监控字段

5.1 v$sql_monitor

字段说明
statusEXECUTING/DONE
elapsed_time总耗时
cpu_timeCPU 时间
buffer_gets逻辑读
disk_reads物理读
process_name进程名
parallel是否并行

5.2 v$sql_plan_monitor

字段说明
plan_line_id步骤号
plan_operation操作
starts启动次数
output_rows输出行数
buffer_gets逻辑读
elapsed_time步骤耗时

6. 应用场景

6.1 调优慢 SQL

-- 1. 查找运行中的慢 SQL
SELECT sql_id, elapsed_time / 1000000 AS sec, status
FROM v$sql_monitor
WHERE status = 'EXECUTING'
ORDER BY elapsed_time DESC;

-- 2. 查看执行步骤
SELECT * FROM v$sql_plan_monitor WHERE sql_id = '&sql_id';

-- 3. 生成报告
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => '&sql_id') FROM dual;

6.2 并行 SQL 监控

-- 查看并行度
SELECT sql_id, parallel, px_servers_requested, px_servers_allocated
FROM v$sql_monitor
WHERE parallel = 'YES';

6.3 历史监控

-- 12c+
SELECT * FROM dba_hist_sql_monitor
WHERE sql_id = '&sql_id';

7. 解读报告

7.1 概要

  • SQL 文本
  • 执行时间
  • CPU 时间
  • I/O 统计

7.2 执行计划

  • 每步耗时
  • 行数
  • 内存
  • 临时空间

7.3 并行

  • QC 进程
  • PX 进程
  • 分发方式

8. ASH 与监控

-- SQL 监控 + ASH
SELECT 
  sql_id,
  event,
  wait_class,
  COUNT(*)
FROM v$active_session_history
WHERE sql_id = '&sql_id'
GROUP BY sql_id, event, wait_class
ORDER BY COUNT(*) DESC;

9. 常见坑与排错

9.1 无监控数据

-- 1. SQL 太短未触发
-- 2. 加 MONITOR HINT
-- 3. 检查 sql_monitor 参数

9.2 历史丢失

-- 默认保留 1 分钟
SHOW PARAMETER sql_monitor

-- AWR 中长期保留

9.3 并行未监控

-- 并行 SQL 自动监控
-- 检查 PARALLEL 属性

10. 最佳实践

  1. 并行 SQL 自动监控:无需配置
  2. MONITOR HINT:强制监控
  3. HTML 报告:易读
  4. 结合 ASH:等待事件
  5. 结合 AWR:历史
  6. 监控长操作:进度
  7. 优化瓶颈步骤:精准
  8. 测试并行:验证
  9. 定期查看:发现慢
  10. 文档化:积累

11. 参考资料

[1] Oracle Database SQL Tuning Guide 19c, “SQL Monitoring” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-monitor.html