Oracle-生成慢SQL的SQL-MONITOR报告

来源:这里教程网 时间:2026-03-03 22:42:33 作者:

使用hint主动监视SQL

说明:若SQL-MONITOR视图已存在,则可跳过此步

脚本示例:

SELECT /*+MONITOR+*/
 T.ID, T1.ID
  FROM TESTTBL T
 INNER JOIN TESTTBL T1
    ON (1 = 1);

生成SQL-MONITOR报告脚本

通过查看SQL-MONITOR视图,构造生成慢SQL的SQL-MONITOR报告。脚本示例:

/**
1.替换以下内容: SQLPLUS SYS/oracle@ORCL as sysdba
2.拷贝查询结果SQLMON_REPORT列脚本,粘贴到DOS窗口下运行
3.查看D盘目录下的SQL-MONITOR.html报告
**/
SELECT *
  FROM (SELECT SA.SQL_ID,
               SA.SQL_TEXT,
               SA.SQL_FULLTEXT,
               'SQLPLUS SYS/oracle@ORCL as sysdba ' || CHR(13) || CHR(10) ||
               'SET TRIM ON ' || CHR(13) || CHR(10) || 'SET trimspool ON ' ||
               CHR(13) || CHR(10) || 'SET arraysize 512 ' || CHR(13) ||
               CHR(10) || 'SET pagesize 0 ' || CHR(13) || CHR(10) ||
               'SET linesize 1000 ' || CHR(13) || CHR(10) ||
               'SET long 1000000 ' || CHR(13) || CHR(10) ||
               'SET longchunksize 1000000 ' || CHR(13) || CHR(10) ||
               'SPOOL D:\慢SQL_sqlmon_' || SA.SQL_ID || '_ACTIVE.html ' ||
               CHR(13) || CHR(10) || '--type:[TEXT,HTML,ACTIVE] ' || CHR(13) ||
               CHR(10) ||
               'SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => ''' ||
               SA.SQL_ID ||
               ''',report_level => ''ALL'',type => ''ACTIVE'') AS SQLMON_REPORT FROM DUAL; ' ||
               CHR(13) || CHR(10) || 'SPOOL OFF; ' || CHR(13) || CHR(10) ||
               'SPOOL D:\慢SQL_sqlmon_' || SA.SQL_ID || '_HTML.html ' ||
               CHR(13) || CHR(10) || '--type:[TEXT,HTML,ACTIVE] ' || CHR(13) ||
               CHR(10) ||
               'SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => ''' ||
               SA.SQL_ID ||
               ''',report_level => ''ALL'',type => ''HTML'') AS SQLMON_REPORT FROM DUAL; ' ||
               CHR(13) || CHR(10) || 'SPOOL OFF; ' || CHR(13) || CHR(10) ||
               'EXIT; ' || CHR(13) || CHR(10) AS SQLMON_REPORT,
               SA.EXECUTIONS "执行次数",
               ROUND(SA.ELAPSED_TIME / 1000000, 2) "总执行时间(s)",
               ROUND(SA.ELAPSED_TIME / 1000000 / SA.EXECUTIONS, 2) "平均执行时间(s)",
               ROWS_PROCESSED "处理数据量",
               ROWS_PROCESSED / EXECUTIONS "平均处理数据量",
               BUFFER_GETS "逻辑读",
               BUFFER_GETS / EXECUTIONS "Gets/Exec",
               DISK_READS "物理读",
               DISK_READS / EXECUTIONS "Reads/Exec",
               SA.COMMAND_TYPE,
               SA.PARSING_USER_ID "用户ID",
               U.USERNAME "用户名",
               SA.HASH_VALUE,
               SA.ADDRESS
          FROM V$SQLAREA SA
          LEFT JOIN ALL_USERS U
            ON SA.PARSING_USER_ID = U.USER_ID
         WHERE EXISTS
         (SELECT 1 FROM V$SQL_MONITOR SM WHERE SM.SQL_ID = SA.SQL_ID)
         ORDER BY (SA.ELAPSED_TIME / SA.EXECUTIONS) DESC);

生成SQL-MONITOR报告

相关推荐