SQL Monitor是Oracle官方提供的自动监控符合特定条件的SQL,用于收集执行时的细节信息的监控工具,常用于SQL调优和系统性能监控。

Oracle 11g中,当SQL满足以下条件之一就会被SQL Monitor捕获到,监控数据被记录在v$sql_monitor视图中,

(1) 当SQL并行执行时,会立即被实时监控到。

(2) 当SQL单进程运行时,如果消耗超过5秒的CPU或I/O时间,会监控到。

(3) 使用/*+ monitor */提示的SQL语句。

另外一个前提,就是以下两个参数的设置,

(1) statistics_level级别必须是TYPICAL或者ALL。

(2) control_management_pack_access设置为'DIAGNOSTIC+TUNING'。

SQL Monitor在Oracle企业版数据库中是免费使用的,打开SQL Monitor Report有两种形式,一个就是通过Oracle EM,中文名称是“SQL监控”,

另外一种获得SQL Monitor Report的形式就是通过dbms_sqltune包,这可能是我们经常用到的,一个原因是我们未必能使用图形界面,尤其是生产环境,端口都是禁用的,另外一个原因,就是我们能在监控脚本中调用dbms_sqltune,便于编写我们的监控逻辑。

我们尝试通过dbms_sqltune看下这个SQL Monitor Report。

(1) 确认参数

SQL> show parameter statistics_level
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
statistics_level                     string      TYPICALSQL> show parameter control_management_pack_access;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_management_pack_access       string      DIAGNOSTIC+TUNING

(2) 确定要监控的SQL ID

其实就是确定什么样的SQL会记录到v$sql_monitor视图中,这里我们采用hint,让SQL进入v$sql_monitor,

SQL> select /*+ monitor */ type, count(*) from v$lock group by type;
TY   COUNT(*)
-- ----------
CF          1
KT          3
RD          1
KD          1
XR          1
RT          1
AE          7
TS          2
RS          1
TO          3
MR         14

可从v$sql或者v$sql_monitor找到这条SQL的ID,

SQL> select sql_id,sql_text from v$sql_monitor where sql_text like '%v$lock%';
SQL_ID                       SQL_TEXT
------------------------------------------------------------------------------
02qa4khbuqv92      select /*+ monitor */ type, count(*) from v$lock group by type

(3) dbms_sqltune

通过设置set,格式化输出,还可以选择spool,将输出打印到本地文件中,其中dbms_sqltune.report_sql_monitor可以指定报告的格式,包括'TEXT'、'HTML'、'XML' 、'ACTIVE'(只在11g R2以后才支持),

SQL> set long 1000000
SQL> set longchunksize 100000
SQL> set linesize 1000
SQL> set pagesize 0
SQL> set trim on
SQL> set trimspool on
SQL> set echo off
SQL> set feedback off
SQL> spool report_sql_monitor.txt
SQL> select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'TEXT', report_level=>'ALL') as report from dual;
SQL Monitoring ReportSQL Text
------------------------------
select /*+ monitor */ type, count(*) from v$lock group by typeGlobal Information
------------------------------Status              :  DONE (ALL ROWS)Instance ID         :  1Session             :  SYS (1:38345)SQL ID              :  02qa4khbuqv92SQL Execution ID    :  16777216Execution Started   :  02/05/2022 15:20:01First Refresh Time  :  02/05/2022 15:20:01Last Refresh Time   :  02/05/2022 15:20:01Duration            :  .027419sModule/Action       :  sqlplus@centos (TNS V1-V3)/-Service             :  SYS$USERSProgram             :  sqlplus@centos (TNS V1-V3)Fetch Calls         :  2Global Stats
========================================
| Elapsed |   Cpu   |  Other   | Fetch |
| Time(s) | Time(s) | Waits(s) | Calls |
========================================
|    0.03 |    0.01 |     0.02 |     2 |
========================================SQL Plan Monitoring Details (Plan Hash Value=3191625931)
==============================================================================================================================================
| Id |         Operation          |    Name    |  Rows   | Cost |   Time    | Start  | Execs |   Rows   |  Mem  | Activity | Activity Detail |
|    |                            |            | (Estim) |      | Active(s) | Active |       | (Actual) | (Max) |   (%)    |   (# samples)   |
==============================================================================================================================================
|  0 | SELECT STATEMENT           |            |         |      |         1 |     +0 |     1 |       11 |     . |          |                 |
|  1 |   HASH GROUP BY            |            |      29 |    2 |         1 |     +0 |     1 |       11 |   1MB |          |                 |
|  2 |    HASH JOIN               |            |    5576 |    1 |         1 |     +0 |     1 |       35 |   1MB |          |                 |
|  3 |     HASH JOIN              |            |     242 |    1 |         1 |     +0 |     1 |       35 |   2MB |          |                 |
|  4 |      VIEW                  | GV$_LOCK   |     242 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
|  5 |       UNION-ALL            |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  6 |        FILTER              |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  7 |         VIEW               | GV$_LOCK1  |     234 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
|  8 |          UNION-ALL         |            |         |      |         1 |     +0 |     1 |       37 |     . |          |                 |
|  9 |           FIXED TABLE FULL | X$KDNSSF   |       1 |      |           |        |     1 |          |     . |          |                 |
| 10 |           FIXED TABLE FULL | X$KSQEQ    |     233 |    1 |         1 |     +0 |     1 |       37 |     . |          |                 |
| 11 |        FIXED TABLE FULL    | X$KTADM    |       1 |      |           |        |     1 |          |     . |          |                 |
| 12 |        FIXED TABLE FULL    | X$KTATRFIL |       1 |      |           |        |     1 |          |     . |          |                 |
| 13 |        FIXED TABLE FULL    | X$KTATRFSL |       1 |      |           |        |     1 |          |     . |          |                 |
| 14 |        FIXED TABLE FULL    | X$KTATL    |       1 |      |           |        |     1 |          |     . |          |                 |
| 15 |        FIXED TABLE FULL    | X$KTSTUSC  |       1 |      |           |        |     1 |          |     . |          |                 |
| 16 |        FIXED TABLE FULL    | X$KTSTUSS  |       1 |      |           |        |     1 |          |     . |          |                 |
| 17 |        FIXED TABLE FULL    | X$KTSTUSG  |       1 |      |           |        |     1 |          |     . |          |                 |
| 18 |        FIXED TABLE FULL    | X$KTCXB    |       1 |      |           |        |     1 |          |     . |          |                 |
| 19 |      FIXED TABLE FULL      | X$KSUSE    |     472 |      |         1 |     +0 |     1 |      472 |     . |          |                 |
| 20 |     FIXED TABLE FULL       | X$KSQRS    |    2304 |      |         1 |     +0 |     1 |     2304 |     . |          |                 |
==============================================================================================================================================SQL> spool off

如果选择HTML格式的,

select dbms_sqltune.report_sql_monitor(sql_id=>'02qa4khbuqv92', type=>'HTML', report_level=>'ALL') as report from dual;

就得到了HTML的SQL Monitor Report,

结合SQL Monitor Report,我们就可以关注其中存在的一些问题,例如通常会根据最右边CPU和wait的activity,找到SQL执行计划中资源消耗较高的步骤。然后看下Oracle估算的返回行数和实际的返回行数是否相差很大,如果估算的行数和实际的行数相差不大,至少表明目前对应数据库对象上的统计信息是准确的,否则就可能存在统计信息不准的问题。还可以关注SQL的筛选条件,判断是否使用了正确的索引等优化手段。

可以说SQL Monitor是个有效采集信息便于诊断SQL性能问题的一个“可视化”工具,但具体的问题和原因,还是要具体分析,看到的,未必是真实的,就像破案一样,这可能才是调优的乐趣所在。

近期更新的文章:

《spool导出格式的问题》

《最近碰到的一些问题》

《关于数据治理的读书笔记 - 什么是数据治理?》

《关于数据治理的读书笔记 - 数据治理、数据管理和数据管控的理解》

《通过Java得到语句的执行计划》

文章分类和索引:

《公众号900篇文章分类和索引》

SQL调优和性能监控利器SQL Monitor相关推荐

  1. tomcat性能调优和性能监控(visualvm)

    tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...

  2. MySQL调优之性能监控

    使用 show profile 查询剖析工具 登录MySQL mysql -uroot -p 输入数据库登录密码 查询mysql版本 select version(); 切换数据库 use lockt ...

  3. SQL调优与报表的性能优化

    原文链接:https://www.iteye.com/blog/shensy-1664549   作者:shensy 一.SQL调优: 1.提升统计查询性能,首当其冲当然还是对查询SQL进行优化,说到 ...

  4. mysql报表统计 优化_关于SQL调优与报表的性能优化

    前一段时间做了某产品实时统计的报表,这周在对报表性能进行优化. 其中逐步积累了一些优化经验,总结一下记录下来,欢迎大家一起探讨. 本文仅限于探讨单个数据库的查询sql及统计报表调优,不涉及分布式数据库 ...

  5. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  6. oracle trim 性能,ORACLE sql调优之记录一次trim函数引发的大表全表扫描

    2017年8月14日,一地市oracle相关的调度程序ETL抽取速度奇慢,sql语句每次执行平均时间要9秒左右,如果所示: 该调度过程涉及的sql语句如下: select count(*) from ...

  7. sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?

    概述 当生产环境发生故障或者系统特别慢的时候,这时候你从awr报告拿到有问题的sql,但是优化的时候却优化了很久还没解决,这时候在领导或者客户面前就不太好了...那么我们怎么去缩短sql调优的时间,一 ...

  8. 面试中sql调优的几种方式_面试方式

    面试中sql调优的几种方式 The first question I ask someone in an interview for a cybersecurity position is, &quo ...

  9. Oracle SQL调优系列之no_unnest和unnest用法简介

    Oracle调优之no_unnest和unnest用法简介 本博客介绍Oracle SQL调优的一种常用也是很实用的方法,也即/*+no_unnest */和/*+ unnest*/,介绍Oracle ...

  10. 读《程序员的SQL金典》[4]--SQL调优

    一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...

最新文章

  1. 想去Google做AI?先看完这套面试指南(附面试题)
  2. 关于量子计算,你应该知道的七个事实
  3. 管理和安装 chart - 每天5分钟玩转 Docker 容器技术(168)
  4. 锐捷设备密码破解方法
  5. 【渝粤教育】电大中专跨境电子商务理论与实务 (29)作业 题库
  6. java 文件上传 servlet_java文件上传-原始的Servlet方式
  7. go语言slice使用的时候遇到的奇怪现象以及分析
  8. eureka集群 ha_SpringCloud如何实现Eureka集群、HA机制-百度经验
  9. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  10. 制作企业批量安装的WIN10封装镜像
  11. 地磅15针到9针数据线连接串口数据采集方法
  12. wacom数位板怎么调压感_怎么设置PS的画笔利用到数位板压感?
  13. 如何执行IntelliJ IDEA 中的.sql文件
  14. 基于RuoYi框架快速搭建自己的后台管理系统
  15. [python]计算miou的方式
  16. 手机怎么更改html打开方式,安卓如何更改文件打开方式?
  17. el-input 密码输入框 显示隐藏优化
  18. eclipse中svn冲突解决
  19. Azure认证 Administrator Associate(AZ-104) 考试指南,资料分享
  20. hdu 1686 Oulipo(kmp)

热门文章

  1. win10时间线时间轴(Timeline)如何关闭隐藏?
  2. 如何排查带宽超过限制?
  3. wincap函数用法简述
  4. JAVA 图片格式转换 jpg、jpeg、png格式互转
  5. 小游戏系列——猜数字游戏
  6. 中级程序员晋升高级程序员,只差这几个技能
  7. 安卓源码目录最全解析
  8. arduino智能闹钟_要写一个Arduino的电子闹钟程序,板子是Arduino UNO,和一个实时钟的芯片DS1307,开发环境是Arduino-1.0.2...
  9. android桌面小部件开发
  10. android来电自定义显示图片,安卓手机如何自定义设置通话背景