小伙伴们是不是一直使用ASH、AWR进行整体性能观测和排查,偶尔也需要单个sql进行监测。用sqlplus中脚本生成监控报告,有些繁琐,如果有条件直接使用SQLDEVELOPER图形界面观察(EMCC,EM24ai上直接查询更方便)。
--参数需配置:STATISTICS_LEVEL必须来自 ALL, TYPICAL, BASIC 之间
-- 设置全局为 TYPICAL(推荐)
ALTER SYSTEM SET STATISTICS_LEVEL = 'TYPICAL';
ALTER SYSTEM SET CONTROL_MANAGEMENT_PACK_ACCESS = 'DIAGNOSTIC+TUNING';
--系统已更改
--提前获得sql_id,从v$sql、awr,当前会话等均可
SELECT /* 20250622_SQLMonitor*/ e.FIRST_NAME,e.JOB_ID,e.IS_PROCESSED
FROM HR.EMPLOYEES e WHERE e.EMPLOYEE_ID>10;
--找寻SQL_ID
SELECT sql_id, plan_hash_value, substr(sql_text,1,40) sql_text
FROM v$sql
WHERE sql_text like 'SELECT /* 20250622_SQLMonitor*/%';
-- 定位行锁争用源头,最近5分钟
SELECT sample_time, session_id, sql_id, blocking_session
FROM v$active_session_history
WHERE event='enq: TX - row lock contention'
AND sample_time > SYSDATE - 5/1440;
--按照查询text中的元素
SELECT sql_id, sql_text
FROM v$sql
WHERE sql_text LIKE '%employees%';
--查询V$SQL视图(实时TOP SQL)
SELECT sql_id, sql_text, executions, buffer_gets, disk_reads, elapsed_time
FROM v$sql
WHERE buffer_gets > 10000 -- 过滤高内存消耗
OR elapsed_time > 1000000 -- 过滤长耗时
ORDER BY elapsed_time DESC; -- 按执行时间排序
--以上查询均可查询SQL_ID,使用第一个标记定位20250622_SQLMonitor找到的SQL_ID
--
SQL_ID PLAN_HASH_VALUE
------------- ---------------
SQL_TEXT
------------------------------------------------------------------------------------------------------------------------
7mab2mxuhbyag 1445457117
SELECT /* 20250622_SQLMonitor*/ e.FIRST_
9tb4h6mg63yn4 2316499954
SELECT /* 20250622_SQLMonitor*/ e.FIRST_
-- 生成TEXT报告
SET LONG 1000000 LONGCHUNKSIZE 1000000 LINESIZE 200
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
sql_id => '9tb4h6mg63yn4',
type => 'TEXT',
report_level => 'ALL'
) FROM dual;
--
DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID=>'9TB4H6MG63YN4',TYPE=>'TEXT',REPORT_LEVEL=>'ALL')
____________________________________________________________________________________________
SQL Monitoring Report
-- 生成ACTIVE报告(提前联网下载对应的文件,加载Flash动态元素形成动态报告)
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(
sql_id => '9tb4h6mg63yn4',
type => 'ACTIVE'
) FROM dual;
--
DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID=>'9TB4H6MG63YN4',TYPE=>'ACTIVE')
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________
-- 使用新包DBMS_SQL_MONITOR
SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(
sql_id => '1vrdkx6kqbfcz',
type => 'HTML'
) FROM dual;
--
DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(SQL_ID=>'1VRDKX6KQBFCZ',TYPE=>'HTML')
--------------------------------------------------------------------------------
SQL Monitor Report