Real-Time SQL Monitoring详解

在Oracle Database 11g中,系统自动监控符合以下条件的SQL,并收集执行时的细节信息:采用并行方式执行,或者单次执行消耗的CPU或者IO超过5秒。SQL Monitoring功能的启动需要以下初始化参数:
— STATISTICS_LEVEL设置为:'TYPICAL'(缺省)或者 'ALL'
— CONTROL_MANAGEMENT_PACK_ACCESS设置为:'DIAGNOSTIC+TUNING'
从V$SQL_MONITOR中可以查到被监控的SQL。如果需要SQL Monitoring手工监控某条SQL可以加上Hint:/*+ MONITOR */
SQL Monitoring可以采用以下3种方式展现:
— EM的:Performance —〉右下角的SQL Monitoring —〉Monitored SQL Executions
— SQL Developer的:Tools —〉Monitor SQL
— DBMS_SQLTUNE包
在处理一些复杂SQL的优化时,我们要根据CBO评估的ROWS以及执行计划中包括的真实ROWS的吻合程度判断一个执行计划的正确与否。在10g的时候,一般可以通过Hint gather_plan_statistics来实现,而在11g中利用SQL Monitor Report就能很方便的显示这部分信息。
新增了两个动态视图:V$SQL_MONITOR和V$SQL_PLAN_MONITOR。

DBMS_SQLTUNE. REPORT_SQL_MONITOR
此函数用于返回某条SQL的SQL Monitoring报告,需要执行的用户有SELECT_CATALOG_ROLE角色。常用的参数如下:
— SQL_ID
缺省为Null,取最后一条被监控的SQL:v$sql_monitor的last_refresh_time最大的SQL。
— SQL_EXEC_ID
同一条SQL多次被监控到时会在v$sql_monitor中产生多条记录,他们的SQL_EXEC_ID是不同的。此参数用于指定:对同一条SQL_ID的哪一个SQL_EXEC_ID出报告。
缺省为Null,取最后一次执行的SQL_EXEC_ID。
— REPORT_LEVEL
报告的详细程度。基本的参数值是:'NONE','BASIC','TYPICAL','ALL',但与DBMS_XPLAN类似,可以用“+”或者“-”来自定义报告中需要列出的内容。比如:'BASIC +PLAN +BINDS'或者'ALL -PLAN'。
— TYPE
产生报告的格式:'TEXT','HTML','XML' ,'ACTIVE'。
其中'ACTIVE'只在11g R2以后才支持,使用HTML和Flash的方式显示动态的报告,与在EM中看到的类似。但其在显示时需要从Oracle网站读取相关联的Javascript和Flash。
如果不能连到Internet又想看ACTIVE Report可以下载相关的库文件到本地的HTTP服务器上,然后用BASE_PATH来制定库文件的位置。
在本地HTTP服务器上创建目录,然后下载下面的文件:
mkdir -p /var/www/html/sqlmon
cd /var/www/html/sqlmon
wget --mirror --no-host-directories --cut-dirs=1  http://download.oracle.com/otn_software/emviewers/scripts/flashver.js
wget --mirror --no-host-directories --cut-dirs=1  http://download.oracle.com/otn_software/emviewers/scripts/loadswf.js
wget --mirror --no-host-directories --cut-dirs=1  http://download.oracle.com/otn_software/emviewers/scripts/document.js
wget --mirror --no-host-directories --cut-dirs=1  http://download.oracle.com/otn_software/emviewers/sqlmonitor/11/sqlmonitor.swf
在调用函数时加上参数,比如:base_path => 'http://192.168.0.4/sqlmon'
— SESSION_ID
指定某个SESSION_ID对应的SQL子集。如果要指定当前SESSION可以用:SYS_CONTEXT('USERENV','SID')。
实验:
SET LONG 1000000
SET LONGCHUNKSIZE 1000000
SET LINESIZE 1000
SET PAGESIZE 0
SET TRIM ON
SET TRIMSPOOL ON
SET ECHO OFF
SET FEEDBACK OFF
SPOOL e:\sql.html
SELECT dbms_sqltune.report_sql_monitor(sql_id       => 'b09ggu59qcupg',
                                   type         => 'HTML',
                                   report_level => 'ALL') AS report
FROM dual;
SPOOL OFF
产生的报告如下图:
 
Real-Time SQL Monitoring详解_第1张图片
比较一下:TYPE='ACTIVE'产生的效果
SPOOL e:\sql.html
SELECT dbms_sqltune.report_sql_monitor(sql_id       => 'b09ggu59qcupg',
                                   type         => 'ACTIVE',
                                   report_level => 'ALL') AS report
FROM dual;
SPOOL OFF
Real-Time SQL Monitoring详解_第2张图片  

DBMS_SQLTUNE. REPORT_SQL_MONITOR_LIST
需要Oracle 11g R2以上版本。此函数用于产生一个对监控SQL的汇总页,类似于EM中的“Monitored SQL Executions”。常用参数:TYPE和REPORT_LEVEL,用法与REPORT_SQL_MONITOR类似。
例如:
SELECT dbms_sqltune.report_sql_monitor_list(
  type         => 'HTML',
  report_level => 'ALL') AS report
FROM dual;

DBMS_SQLTUNE. REPORT_SQL_DETAIL
需要Oracle 11g R2以上版本。此函数用于根据各种条件参数(包括:start_time, end_time, duration, inst_id, dbid, event_detail, bucket_max_count, bucket_interval, top_n, duration_stats),产生比使用REPORT_SQL_MONITOR更加详细的SQL报告。
例如:
SELECT dbms_sqltune.report_sql_detail(top_n        => 5,
                                 TYPE         => 'html',
                                 report_level => 'ALL') AS report
FROM dual;
产生的报告包含更多的信息:
Real-Time SQL Monitoring详解_第3张图片
 
备注: 
在11.2.0.4中SQL Monitoring功能还是存在一些Bug,有些SQL在执行时会出现“LPX-00225: 结束元素标记 "sql" 与起始元素标记 "action" 不匹配”等异常。

你可能感兴趣的:(sql,monito,Real-Time,VSQL_MONITOR)