前言

oracle的性能监测工具除了AWR、ASH、ADDM,还可以参考oracle的动态性能视图:v$active_session_history (dba_hist_active_sess_history)、v$sqlstats(dba_hist_sqlstat)、v$sqlarea、v$session_longops等,但是这些视图都是一段时间内的汇总,没有单条sql的执行情况。

而sql monitor提供类似mysql 慢sql日志功能,相关的动态视图v$sql_monitor、v$sql_plan_monitor

The V$SQL_MONITOR view contains a subset of the statistics available in V$SQL. However, unlike V$SQL, monitoring statistics are not cumulative over several executions. Instead, one entry in V$SQL_MONITOR is dedicated to a single execution of a SQL statement. If two executions of the same SQL statement

are being monitored, each of these executions will have a separate entry in V$SQL_MONITOR

To uniquely identify two executions of the same SQL statement, a composite key called an execution key is generated. This execution key is composed of three attributes, each corresponding to a column in V$SQL_MONITOR:

• SQL identifier to identify the SQL statement (SQL_ID)

Start execution timestamp (SQL_EXEC_START)

• An internally generated identifier to ensure that this primary key is truly

unique (SQL_EXEC_ID)

一、确认sql monitor是否开启

默认的,statistics_level和control_management_pack_access为TYPICAL和DIAGNOSTIC+TUNING,即自动开启sql monitor。

二、sql被捕获的前提

sql monitor开启后,会自动捕获符合下面条件之一的sql到v$sql_monitor

即:

1、sql单次执行的IO/CPU时间超过5s

2、并行执行的sql,如加 /*+parallel(t,4)*/

3、加/*+monitor*/这种强制监控的语句

4、无法修改代码,监控某sql_id,在实例层面监控此sql

经测试,alter system set events sql_monitor的方式并无法监控sql_id,官方文档提及此功能有待商榷,所以v$sql_monitor中的内容目前只有前3种;

因为sql monitor可以记录超过5s的sql,这对于我们平常调优有很大的参考意义

三、与sql monitor有关的参数

v$sql_monitor等动态视图每秒刷新一次,一些sqlmon隐含参数(不重启即可生效)如:

_sqlmon_recycle_time 监控的语句在动态视图中的保留时间(s)

_sqlmon_threshold 语句被监控的最小执行时间,类似mysql的long_query_time(默认为5s)

set lines 400;

col name for a30;

col value for a10;

col description for a80

select

x.ksppinm name,

y.ksppstvl value,

y.ksppstdf isdefault,

decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod,

decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj,

KSPPDESC description

from

sys.x$ksppi x,

sys.x$ksppcv y

where

x.inst_id = userenv('Instance') and

y.inst_id = userenv('Instance') and

x.indx = y.indx and x.ksppinm like '%sqlmon%'

order by

translate(x.ksppinm, ' _', ' ');

四、sql monitor报告查看

oracle cloud control上显示的sql monitor信息如下

如果没有GC,可以使用DBMS_SQLTUNE.report_sql_monitor来查看,比如

已知一个慢sql的sql_id,如果此sql执行时间超过5s,就能自动被加入v$sql_monitor,可以临时改_sqlmon_recycle_time到300(保留5min,注意抓到sql之后需要改回默认值,一面过多占用sga资源),通过以下命令得到sql的执行id:

select max(elapsed_time/1000),max(CPU_TIME/1000),max(QUEUING_TIME/1000) from v$sql_monitor where sql_id='6pkhg3spj2mr5';

select SQL_EXEC_ID from v$sql_monitor where elapsed_time/1000>5 and sql_id='6pkhg3spj2mr5';

通过sql_id和SQL_EXEC_ID得到此次执行的monitor report

set long 10000000

set longchunksize 10000000

set linesize 200

SELECT DBMS_SQLTUNE.report_sql_monitor(sql_id => '6pkhg3spj2mr5', type => 'TEXT',SQL_EXEC_ID=>'19310619') report FROM dual;

如果sql的执行时间小于5s大于1s,可以临时修改_sqlmon_threshold为1,将1s以上的sql全部monitor(注意抓到sql之后需要改回默认值,一面过多占用sga资源);

如果sql的执行时间小于1s,因为_sqlmon_threshold只能为整数,就要自己根据原来的sql构造监控sql,强制加/*+monitor*/,再通过sql_id和SQL_EXEC_ID得到monitor report。

除了text,还可以得到html版的report下载查看

五、关闭sql monitor

修改隐含参数_sqlmon_threshold为0即可关闭sql monitor,防止某sql从v$sql_monitor age out,除了增大_sqlmon_recycle_time,还可以临时关闭sql monitor(记得分析完恢复)

关闭:

alter system set "_sqlmon_threshold"=0;

开启:

alter system set "_sqlmon_threshold"=5;

_sqlmon_threshold设为0后,以下sql全都不再被自动监控

1、sql单次执行的IO/CPU时间超过5s

2、加hint并行执行的sql,如加 /*+parallel(t,4)*/

3、加/*+monitor*/这种强制监控的语句

参考文档

Monitoring Database Operations

V$SQL_MONITOR

oracle sql monitor相关推荐

  1. 【SQL】Oracle SQL monitor

    [SQL]Oracle SQL monitor 第一章 被埋没的SQL优化利器--Oracle SQL monitor DBAplus社群 | 2015-11-26 07:00 转载声明:本文为DBA ...

  2. oracle sql monitor report,掌握SQL Monitor这些特性,SQL优化将如有神助!

    原标题:掌握SQL Monitor这些特性,SQL优化将如有神助! SQL分析的苦与痛 对于线上的SQL语句,很多DBA都总会有一些疑问,看着执行计划cost还不错,但是实际执行的时候效果却有天壤之别 ...

  3. sql monitor简介

    Sql monitor 简介 11g 之后的版本 oracle 提供了一种实时 sql 监控工具,即 sql monitor .默认情况下,当 sql 开启并行,或者 sql 的单词执行时间超过 5 ...

  4. EBS_DBA_优化:掌握SQL Monitor这些特性,SQL优化将如有神助! (转)

    SQL分析的苦与痛 对于线上的SQL语句,很多DBA都总会有一些疑问,看着执行计划cost还不错,但是实际执行的时候效果却有天壤之别,这是为什么呢? 对于一个庞大的SQL语句,看着得到的执行计划却不知 ...

  5. oracle sql execute elapsed time,sql duration 和 elapsed_time 的区别

    今天在处理一个long run sql的时候发现了这个问题,sql duration和elapsed_time的区别貌似有时候非常大. oracle doc上关于 elaspsed_time : EL ...

  6. oracle判断非空并拼接,oracle sql 判断字段非空,数据不重复,插入多跳数据

     oracle sql 判断字段非空,数据不重复 select distinct(mobile) from wx_user_mobile where active_time is not null ...

  7. Oracle SQL高级编程——分析函数(窗口函数)全面讲解

    Oracle SQL高级编程--分析函数(窗口函数)全面讲解 注:本文来源于:<Oracle SQL高级编程--分析函数(窗口函数)全面讲解> 概述 分析函数是以一定的方法在一个与当前行相 ...

  8. Oracle SQL Developer 的一个Bug

    Oracle SQL Developer是Oracle近几年来推出的一款免费的图形界面SQL PL/SQL开发工具,在11g中它甚至被集成到了Oracle server软件中:如果你平常有用这款IDE ...

  9. oracle求某个数的阶乘,Oracle SQL实现阶乘的几个方法

    Oracle SQL实现阶乘的几个方法 regonly1 2010-06-07 16:24:39 Linux操作系统 第一个:字符串叠加运算法 原理是先将要相乘的数用字符串拼接起来,然后将拼接的逗号替 ...

  10. Oracle数据库以及Oracle SQL Developer初体验

    首先进入SQL PLUS,这里输入 sys/as sysdba,回车.(貌似是超级管理员权限).之后也可以在里面建表插入等. 接下来讲讲如何用Oracle SQL Developer建表等操作. 先进 ...

最新文章

  1. 下载和安装Nginx之普通的HTTP和HTTPS服务器
  2. WinRT界面控件Essential Studio上如何选择时间范围
  3. c语言115写成16进制,C语言指针问题
  4. c标准基本库函数:libc、glibc的关系
  5. jQuery对象的序列化详解
  6. 在windows下查看SQLite数据库
  7. 【C语言】qsort函数用法(转)
  8. html怎么把excel表格合并单元格,Excel中如何快速合并多个单元格
  9. delphi Hi 和 High
  10. 【VMware vSAN 6.6】5.4.vSAN 配置提示:vSAN硬件服务器解决方案
  11. share my tools With Xcode
  12. 我是这样在第一轮筛选简历的
  13. Silverlight 功能其全的PDF 控件
  14. visio2003 数据表模型中显示字段类型和注释
  15. 谁是应用软件商店急需的外援
  16. 织梦dedecms蓝色大学院校学校网站模板(自适应手机移动端)
  17. 导弹拦截(动态规划)
  18. android屏幕重力感应器,android屏幕重力感应如何实现,很质量的一个问题
  19. Mybatis-plus 分页功能报错:除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
  20. SLAM十四讲第三讲实践:useGeometry------小白强行读代码

热门文章

  1. 最简单易懂的git介绍
  2. 【一牛鸣】大盘将持续震荡9.13
  3. 关于模拟信号和数字信号的储存
  4. 无线电波段和频谱的划分
  5. 我的2018年考博英语复习计划Share
  6. IDEA鼠标光标变黑块问题解决
  7. 保护眼睛android版本,夜间护眼软件下载-夜间护眼 安卓版v4.9.1-PC6安卓网
  8. 中南林业科技大学Java实验报告八:包与接口
  9. 网络安全行业全领域白皮书
  10. 如何在BaseFragment中直接调用BaseActivity中相关属性代码的问题