获取 SQL Monitor 报告(正在运行或已完成的长 SQL)
Oracle性能命令
-- List monitored SQL (longer than 5 s, parallel, or /*+ MONITOR */):
SELECT sql_id, status, username, sql_exec_id,
TO_CHAR(sql_exec_start,'YYYY-MM-DD HH24:MI:SS') AS exec_start,
ROUND(elapsed_time/1e6,1) AS elapsed_s,
ROUND(cpu_time/1e6,1) AS cpu_s,
buffer_gets, px_servers_allocated
FROM v$sql_monitor
ORDER BY sql_exec_start DESC
FETCH FIRST 20 ROWS ONLY;
-- TEXT report (actual rows, time and activity per plan line):
SET LONG 10000000 LONGCHUNKSIZE 10000000 LINESIZE 300 PAGESIZE 0 TRIMSPOOL ON
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
sql_id => '<sql_id>',
type => 'TEXT',
report_level => 'ALL') AS report
FROM dual;
-- Shareable HTML (interactive in a browser):
SPOOL /tmp/sqlmon_<sql_id>.html
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
sql_id => '<sql_id>', type => 'ACTIVE', report_level => 'ALL')
FROM dual;
SPOOL OFF作用
Real-Time SQL Monitoring 针对长时间运行或并行 SQL 执行计划的每一步,显示实际行数、耗时、内存/temp 使用和 ASH 活动;可在 SQL 仍在运行时观察进度。
适用场景
判断批处理/报表查询是否卡住以及还剩多少、分析并行查询分布(PX skew),以及找出估算行数(E-Rows)与实际行数之间的差距时。
注意
需要 Tuning Pack 许可(以 Diagnostics Pack 为前提)。默认只监控消耗 5 s CPU/I-O 或并行运行的 SQL;其他 SQL 请使用 /*+ MONITOR */ hint。非常大的计划(_sqlmon_max_planlines,默认 300)不会被监控。条目只在内存中保留有限时间;在 12c+ 中较早的报告也可从 DBA_HIST_REPORTS 获取。