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
| 字段 | 说明 |
|---|---|
| status | EXECUTING/DONE |
| elapsed_time | 总耗时 |
| cpu_time | CPU 时间 |
| 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. 最佳实践
- 并行 SQL 自动监控:无需配置
- MONITOR HINT:强制监控
- HTML 报告:易读
- 结合 ASH:等待事件
- 结合 AWR:历史
- 监控长操作:进度
- 优化瓶颈步骤:精准
- 测试并行:验证
- 定期查看:发现慢
- 文档化:积累
11. 参考资料
[1] Oracle Database SQL Tuning Guide 19c, “SQL Monitoring” https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/sql-monitor.html