【SQL】Oracle数据库监控sql执行情况

概述

在11G中,Real-Time SQL Monitoring可以让你监控单个SQL或PL-SQL的执行情况。从12c开始,提供了实时监控更为复杂的操作。12c中,Real-time database operations该特性允许你监控混合的操作包括一些SQL和PL/SQL。通过DBMS_SQL_MONITOR这个包去实现。

Oracle数据库默认会启动SQL监控,数据库会在满足以下任一条件时自动监视相关操作。

  • 相关语句单次执行至少消耗了5秒的CPU或I/O时间
  • SQL语句并行执行
  • SQL语句指定了/ + MONITOR / 提示
  • 指定了相关事件,sql_id。
--查看数据库是否启用sql monitor (默认启用:TYPICAL,或者ALL)
show parameter statistics_level
--为相关sql_id设置事件
ALTER SYSTEM SET EVENTS 'sql_monitor [sql: 5hc07qvt8v737|sql: 9ht3ba3arrzt3] force=true';

监控启动后,数据库将操作的元数据存储在AWR和ASH中。数据库实时刷新统计信息,每秒一次。

每个受监控的数据库操作在V\$SQL_MONITOR视图中都有一个条目。此条目跟踪为执行收集的关键性能指标,包括已用时间、CPU 时间、读取和写入次数、I/O 等待时间和各种其他等待时间。该V$SQL_PLAN_MONITOR视图包括被监控的 SQL 语句的执行计划中每个操作的监控统计信息。可以使用DBMS_SQL_MONITOR.REPORT_SQL_MONITOR或者OEM查看报告。

DBMS_SQL_MONITOR (Oracle12c+)

该包主要用于启动复杂数据库语句及打印相关监控报告。常用的子程序如下:
子程序|描述
—- |—-
BEGIN_OPERATION| 启动监控,12.2开始,可以指定session_id和session_num开始监控会话。
END_OPERATION | 结束监控
REPORT_SQL_MONITOR | 打印详细报告,相关语句的监控信息。此报告可以打印:
• 数据库监控的最后一次操作(默认)
• 指定会话执行。会话有气会话ID和可选的序列号(-1是当前会话)表示.
• 尤其最后只的sql_id
• 具体执行组合,sql_id,sql_exec_start和sql_exec_id
• 由标识的特点数据库操作的最后一次dbop_name。
• 由组合具体执行的dbop_name,dbop_exec_id.
使用type参数指定输出类型,默认text,html等。

监控视图

表名 描述
DBA_HIST_REPORTS 此视图显示有关在自动工作负载存储库 (AWR) 中捕获的 XML 报告的元数据。每个 XML 报告都包含有关组件某些活动的详细信息。例如,SQL Monitor 报告包含有关特定数据库操作的详细报告。
DBA_HIST_REPORTS_DETAILS 此视图显示有关在 AWR 中捕获的每个报告的详细信息。每个报告的元数据显示在DBA_HIST_REPORTS视图中,而实际报告在DBA_HIST_REPORTS_DETAILS视图中可用。
V$SQL_MONITOR 此视图包含有关简单和复合数据库操作的全局高级信息。
V$SQL_MONITOR_SESSTAT 此视图包含数据库操作中涉及的所有会话的统计信息。(累计)
V$SQL_PLAN_MONITOR 该视图包含监控 SQL 语句执行计划中每个步骤的监控统计信息。

以上视图可以结合下面视图一起使用

  • V$ACTIVE_SESSION_HISTORY
  • V$SESSION
  • V$SESSION_LONGOPS
  • V$SQL
  • V$SQL_PLAN

监控语句:语句级

--启用
SELECT /*+ MONITOR */  prod_id, AVG(amount_sold), AVG(quantity_sold) 
FROM   sales
GROUP BY prod_id
ORDER BY prod_id;
--关闭
SELECT /*+ NO_MONITOR */  prod_id, AVG(amount_sold), AVG(quantity_sold) 
FROM   sales
GROUP BY prod_id
ORDER BY prod_id;

监控语句:复合操作(Oracle12c+)

--1.开始监控,返回操作id,以便后续结束
VARIABLE exec_id NUMBER; 
BEGIN 
  :exec_id := DBMS_SQL_MONITOR.BEGIN_OPERATION ( dbop_name => 'SHOP' , forced_tracking => 'Y'); 
END; 
/
--2.执行相关操作
--3.结束
BEGIN
  DBMS_SQL_MONITOR.END_OPERATION ( dbop_name => 'SHOP', dbop_eid => :exec_id );
END;
/
--4.查看状态,后续可导出报告
COL STATUS FORMAT a10
COL DBOP_NAME FORMAT a10
COL CON_NAME FORMAT a5
SELECT STATUS, SQL_ID, DBOP_NAME, DBOP_EXEC_ID,
       TO_CHAR(ELAPSED_TIME/1000000,'000.00') AS ELA_SEC 
FROM   V$SQL_MONITOR
WHERE  DBOP_NAME = 'SHOP';
--5.生成报告
SET TRIMSPOOL ON
SET TRIM ON
SET PAGES 0
SET LINESIZE 1000
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SPOOL /tmp/shop.html
SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(dbop_name=>'SHOP',report_level=>'ALL',TYPE=>'active') 
FROM   DUAL;
SPOOL OFF

监控示例:生成报告

开始监控
SELECT /*+ MONITOR */ s.prod_id, c.cust_last_name FROM sh.sales s, sh.customers c where s.CUST_ID=c.CUST_ID ORDER BY prod_id;

Oracle11.2生成报告

--生成text报告
SELECT DBMS_SQLTUNE.report_sql_monitor(
  type         => 'text',
  report_level => 'ALL') AS report
FROM dual;
--or
SET LONG 1000000
VARIABLE my_rept CLOB;
BEGIN
  :my_rept := DBMS_SQLTUNE.REPORT_SQL_MONITOR(
                report_level => 'ALL', 
                type         => 'text');
END;
/
PRINT :my_rept
--创建一个活动报告,html格式的图例
SET FEEDBACK OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
SET TRIM ON
SET PAGES 0
SET LINESIZE 1000
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SPOOL /tmp/long_sql.html
SELECT DBMS_SQLTUNE.report_sql_monitor(
  type         => 'ACTIVE',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF

Oracle12+生成报告

--生成text报告
SELECT DBMS_SQL_MONITOR.report_sql_monitor(
  type         => 'text',
  report_level => 'ALL') AS report
FROM dual;
--or
SET LONG 1000000
VARIABLE my_rept CLOB;
BEGIN
  :my_rept := DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(
                report_level => 'ALL', 
                type         => 'text');
END;
/
PRINT :my_rept
--创建一个活动报告,html格式的图例
SET FEEDBACK OFF
SET TERMOUT OFF
SET TRIMSPOOL ON
SET TRIM ON
SET PAGES 0
SET LINESIZE 1000
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SPOOL /tmp/long_sql.html
SELECT DBMS_SQL_MONITOR.report_sql_monitor(
  type         => 'ACTIVE',
  report_level => 'ALL') AS report
FROM dual;
SPOOL OFF
报告参考(两版本区别):

程序详情

DBMS_SQL_MONITOR(DBMS_SQLTUNE).REPORT_SQL_MONITOR

-- 12.1+
DBMS_SQL_MONITOR.REPORT_SQL_MONITOR (
   sql_id                    IN VARCHAR2 DEFAULT  NULL,
   dbop_name                 IN VARCHAR2 DEFAULT  NULL,
   dbop_exec_id              IN NUMBER   DEFAULT  NULL,
   session_id                IN NUMBER   DEFAULT  NULL,
   session_serial            IN NUMBER   DEFAULT  NULL,
   sql_exec_start            IN DATE     DEFAULT  NULL,
   sql_exec_id               IN NUMBER   DEFAULT  NULL,
   inst_id                   IN NUMBER   DEFAULT  NULL,
   start_time_filter         IN DATE     DEFAULT  NULL,
   end_time_filter           IN DATE     DEFAULT  NULL,
   instance_id_filter        IN NUMBER   DEFAULT  NULL,
   parallel_filter           IN VARCHAR2 DEFAULT  NULL,
   plan_line_filter          IN NUMBER   DEFAULT  NULL,
   event_detail              IN VARCHAR2 DEFAULT  'YES',
   bucket_max_count          IN NUMBER   DEFAULT  128,
   bucket_interval           IN NUMBER   DEFAULT  NULL,
   base_path                 IN VARCHAR2 DEFAULT  NULL,
   last_refresh_time         IN DATE     DEFAULT  NULL,
   report_level              IN VARCHAR2 DEFAULT 'TYPICAL',
   type                      IN VARCHAR2 DEFAULT 'TEXT',
   sql_plan_hash_value       IN NUMBER   DEFAULT  NULL,
   con_name                  IN VARCHAR2 DEFAULT  NULL)
  RETURN CLOB; 
--11.2
DBMS_SQLTUNE.REPORT_SQL_MONITOR(
   sql_id                    IN VARCHAR2  DEFAULT  NULL,
   session_id                IN NUMBER    DEFAULT  NULL,
   session_serial            IN NUMBER    DEFAULT  NULL,
   sql_exec_start            IN DATE      DEFAULT  NULL,
   sql_exec_id               IN NUMBER    DEFAULT  NULL,
   inst_id                   IN NUMBER    DEFAULT  NULL,
   start_time_filter         IN DATE      DEFAULT  NULL,
   end_time_filter           IN DATE      DEFAULT  NULL,
   instance_id_filter        IN NUMBER    DEFAULT  NULL,
   parallel_filter           IN VARCHAR2  DEFAULT  NULL,
   plan_line_filter          IN NUMBER    DEFAULT  NULL,
   event_detail              IN VARCHAR2  DEFAULT  'YES',
   bucket_max_count          IN NUMBER    DEFAULT  128,
   bucket_interval           IN NUMBER    DEFAULT  NULL,
   base_path                 IN VARCHAR2  DEFAULT  NULL,
   last_refresh_time         IN DATE      DEFAULT  NULL,
   report_level              IN VARCHAR2  DEFAULT 'TYPICAL',
   type                      IN VARCHAR2  DEFAULT 'TEXT',
   sql_plan_hash_value       IN NUMBER    DEFAULT  NULL)
RETURN CLOB;

参考:

请使用浏览器的分享功能分享到微信等