SQL Monitor 是 Oracle 数据库(从 11g 开始引入并持续增强)内置的一项 实时性能诊断和监控 功能。它是 Real-Time SQL Monitoring 功能的核心组成部分。它的主要目的是提供正在执行的长时运行或资源密集型 SQL 语句的 实时、详细执行计划和运行时统计信。 , 帮 助 D BA 和 开 发 人 员 快 速 识 别 性 能 瓶 颈 、 理 解 执 行 行 为 并 进 行 调 优 。
-
实时监控:
- 这是 SQL Monitor 最核心的优势。它允许你在 SQL 语句
运行时就监控其执行细节,而不需要等到语句执行完毕(如使用
DBMS_XPLAN 或 AWR/ASH 报告是事后分析)。- 对于长时间运行的语句(如报表、批量加载、复杂分析查询),这提供了极大的便利性。
自动激活:
- SQL Monitor 通常是自动启用的,无需用户干预,只要 SQL 语句满足以下任一条件:
- 启用了并行执行 (
PARALLEL Hint 或对象并行度 > 1)- 单次执行预计总耗时超过 5 秒(由优化器估算)
- 消耗了显著的 CPU 或 I/O 资源(由内部阈值决定)
- 使用了
MONITOR 或NO_MONITOR Hint 显式控制(/*+ MONITOR */ //*+ NO_MONITOR */)- 一旦激活,监控信息会持续收集直到语句执行完成(或超时)。
可视化执行计划:
- SQL Monitor 报告的核心是一个 图形化(在 EM 中)或结构化文本(在报告中)的执行计划。
- 与传统
EXPLAIN PLAN 或DBMS_XPLAN.DISPLAY_CURSOR 不同,它展示的是 实际正在使用的执行计划及其在运行时的状态。丰富的运行时统计信息:
- 在每个执行计划的操作上(如
TABLE ACCESS,HASH JOIN,SORT GROUP BY 等),SQL Monitor 提供关键的运行时指标:- 进度: 执行完成了多少(百分比)。
- 实际行数 (A-Rows): 该操作实际输出的行数。
- 预估行数 (E-Rows): 优化器当初预估该操作输出的行数(便于发现预估偏差)。
- 已处理行数: 该操作处理的总行数(可能包括过滤或连接条件丢弃的行)。
- 时间: 该操作消耗的数据库时间 (
DB Time) 和 CPU 时间。- 内存使用: 该操作使用的 PGA 内存(如
HASH JOIN 的哈希区大小)。- I/O: 物理读 (
Disk Reads) 和逻辑读 (Buffer Gets)。- 并行执行: 如果启用了并行,会显示并行服务器进程 (
PX) 的数量、它们之间的数据分布方式 (DOP - Degree of Parallelism) 以及并行协调器 (QC) 的状态。- 等待事件: 该操作遇到的关键等待事件(如
db file sequential/scattered read,direct path read/write,enq: TM - contention 等)及其等待时间。- 绑定变量值: 如果使用了绑定变量,报告通常会显示执行时使用的实际值(对诊断计划选择问题至关重要)。
接下来介绍几种获取该报表的方式:
一、 sqlplus 中查看:
SET LONG 1000000 SET LONGCHUNKSIZE 1000000 SET LINESIZE 1000 SET PAGES 999 SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => 'your_sql_id') AS report FROM dual;

二、拉取 HTML 的形式查看:
1 、使用 Oracle Enterprise Manager (OEM):
登录到 OEM 控制台。
导航到 “ 性能 ” -> “SQL Monitor” 。
在 SQL Monitor 页面,找到你想要查看的报告。
点击报告旁边的 “ 查看报告 ” 或类似的按钮。
选择 “HTML” 格式,然后点击 “ 生成报告 ” 。
报告生成后,你可以选择保存或直接在浏览器中查看
2 、使用 SQL Developer:
在 SQL Developer 中,连接到你的数据库。
导航到 “ 性能 ” 标签页。
在 “SQL Monitor” 部分,找到你想要查看的报告。
右键点击报告,选择 “ 查看报告 ” 。
SQL Developer 会显示 HTML 格式的报告。
3 、使用 SQL 命令 :
你可以使用 DBMS_SQLTUNE.REPORT_SQL_MONITOR 函数来获取 HTML 格式的报告。首先,你需要知道 SQL 语句的 SQL ID 。
使用以下 SQL 命令来生成 HTML 报告:
SET LONG 1000000 SET PAGES 999 SET LONGCHUNKSIZE 1000000 SET LINESIZE 1000 SET TRIMSPOOL ON SPOOL sql_monitor_report.html SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id => 'your_sql_id', type => 'HTML') AS report FROM dual; SPOOL OFF
执行上述命令后,报告将被保存到当前工作目录下的 sql_monitor_report.html 文件中。
