掌握SQL Monitor这些特性,SQL优化将如有神助!


SQL分析的苦与痛
 

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

 

对于一个庞大的SQL语句,看着得到的执行计划却不知道瓶颈在哪里,SQL语句太复杂,执行计划看起来更复杂,要读明白它掌握要领也不是一件容易的事情。
 

偶尔会有一些朋友问我,怎么去读一个执行计划,这个无论说得怎么细,似乎都不得要领,毕竟纯文字描述和图形的效果还是有很大的差别。
    

如果你在11g的版本中,SQL Monitor就是一个大大的福利,上面的问题可能都会在此化解,这个特性你值得掌握,如果你还没有好好掌握它,就实在太可惜了。
  

至于SQL Monitor更多的细节就不一一描述了,11g推出的这个特性其实和MySQL里的慢日志有些类似,MySQL里面的阈值要更低一些,SQL Monitor是5秒。一旦达到这个标准,就会进收集到v$sql_monitor这个视图中,可以得到详细的会话信息和执行计划。

 

指定的SQL使用SQL Monitor监控
 

如果某条语句想使用SQL Monitor来监控,单独来定制,也不是一件难事。可以使用Hint monitor来完成。比如这样的形式:

select /*+ monitor */ count(*) from emp where  xxxxx
 

如果确认不需要放入监控范围,也可以使用no_monitor来定制,比如这样的形式

select /*+ no_monitor */ count(*) from emp where  xxxxx
 

查看SQL Monitor报告的方式:

 

查看生成的监控信息,可以使用如下的方式:

select dbms_sqltune.report_sql_monitor from dual;
 

除了调用DBMS_SQLTUNE包得到报告外,此外可以采用以下2种方式来得到SQL Monitor内容:

 (1)EM的:Performance —〉右下角的SQL Monitoring —〉Monitored SQL Executions 
(2) SQL Developer的:Tools Monitor SQL

 

格式丰富的SQL Monitor报告
 

当然这些都是SQL Monitor常规的一些知识点,还不足以让我兴趣大开。我感兴趣的是它强大的UI展现能力。听起来这个似乎和这个特性好像关联不大,你如果看到效果就知道了,还是那句话,一个很复杂,抽象的事物如果用图形表示,要远比文字丰富形象得多。
 

SQL Monitor报告格式,大体有以下几种格式。TEXT,HTML,ACTIVE,XML四种,不过我们着重来说一下前三种,虽然看起来格式繁多,我们打一个比方就容易理解了。有些手机会按照配置来冠以各种名号。

 

SQL Monitor的报告也可以这么区分,TEXT格式是标准版,HTML是高配版,ACTIVE是尊享版,我们不来虚的,来实际看看效果。

 

文本格式的效果如下:  
 

 

HTML格式的效果如下:  
 

SQL信息,会话信息,执行计划一目了然,非常贴心。

 

 
那么ACTIVE格式是什么意思呢,就是最炫最全面的效果,打开的时候竟然还有一个小的flash效果。

 

ACTIVE格式的报告效果如下:  
 

 

有的朋友可能看到会说,这和HTML的效果有啥差别啊,有的,我再给一张图你就明白了。

 

执行计划原来可以这么读。全表扫描,索引扫描,表连接信息都一目了然,越是复杂的执行计划这种方式越省事。

SQL文本和绑定变量的信息,点击SQL_ID就会弹出一个小窗口来。

 

得到TEXT,HTML报告的脚本  
 

好吧,看起来这么炫,想得到这个报告难不难呢,其实很简单,就一个SQL语句就能搞定,绝对没有标题党的意思。

如果想写成shell脚本,就是嵌入一个SQL语句,本质就是调用dbms_sqltune.report_sql_monitor即可。脚本内容如下:

tmp_sql_id=$1
sqlplus -s  / as sysdba<<>

set trimspool on trim on

set pages 0 linesize 1000

set long 1000000 longchunksize 1000000
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '${tmp_sql_id}',
report_level => 'ALL',
type=>'TEXT') 
FROM dual;
EOF

 

唯一的差别就是在type的地方。TEXT,HTML的就设置为TEXT,HTML即可。

 

得到ACTIVE格式报告的方法  
 

如果是ACTIVE格式的,这个咱得稍说一下背景。

这个功能在Enterprise Manager中查看是很自然的一件事情,如果没有安装EM,我们不能因为这个专门去部署一个EM来不是。要达到同样的效果,有两种方式,一种是通过网络下载所需的脚本,即在线查看,另外一种是离线查看,需要提前把几个脚本下载到本地即可。所以要得到一个报告并显示出来,这些工作都可以搞定,办法总比困难多。

 

如果要得到一个在线的报告,可以使用如下的方式得到,脚本内容如下:

tmp_sql_id=$1
sqlplus -s  / as sysdba<<>

set trimspool on trim on

set pages 0 linesize 1000

set long 1000000 longchunksize 1000000
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '${tmp_sql_id}',
report_level => 'ALL',
type=>'ACTIVE') 
FROM dual;
EOF

 

你没有看错,这个和TEXT,HTML的方式几乎一样。可以在浏览器中打开的时候有一些差别,那就是这种方式会尝试从Oracle的站点下载几个脚本,这种方式如果没有网络是无法打开报告的。

 

下载的脚本是哪些呢,这就牵扯出离线查看的内容。

 

我们可以在本地设置一个目录结构,设置一个类似的站点http://www.jeanron100在本地创建一个jeanron100的目录:

mkdir -p jeanron100/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

如果在windows上下载,直接输入上面的URL即可。

 

生成SQL语句的ACTIVE报告使用如下的方式即可:

SELECT dbms_sqltune.report_sql_monitor(
sql_id => '${tmp_sql_id}',
report_level => 'ALL',
type=>'ACTIVE',
base_path =>'http://www.jeanron100/sqlmon') 
FROM dual;

 

把拷贝到的结果以HTML格式保存,在本地的目录下打开,离线报告建议用IE打开会流畅一些,有的浏览器可能有其他的安全限制。如果感兴趣也可以读一下生成的内容,里面大量使用了XML解析的方式。

 

SQL Monitor List的使用
 

如果在这个基础上还想做些什么的话,其实还有不少,比如我们查看v$sql_monitor的结果。

SQL> select count(*)from v$sql_monitor;

  COUNT(*)

----------

       160

 

竟然有这么多的SQL语句,我们有没有方法来得到一个概览信息呢。

 

 

使用的语句如下:

SELECT dbms_sqltune.report_sql_monitor_list( type => 'HTML',  report_level => 'ALL') AS report  FROM dual;

 

这个方法你用还是不用都在那儿。当然可以直接从v$sql_monitor里抽出数据来也可以,整体而言效果还是蛮不错的。

 

强大的SQL Detail Report
 

还有没有好玩的功能了呢,有的。SQL Detail Report,这个报告比SQL Monitor的ACTIVE报告还要更丰富一些。同样一个语句在不同时间的执行情况都一目了然,这对于分析性能问题尤其有帮助。

 

 

还可以看到历史执行过程中处理的行数,执行次数,DB time的情况,指标非常多,非常全。

 

 

得到这么一个报告麻烦吗,还是一个SQL语句即可,不过调用的是另外一个方法了,注意此处的报告格式还是ACTIVE。

set pages 0

set linesize 200

col comm format a300

set long 99999999

SELECT dbms_sqltune.report_sql_detail(

sql_id => 'xxxx',

report_level => 'ALL',

type=>'ACTIVE'

) comm

FROM dual;

 

如果查看一个指定时间范围内的报告信息,可以采用下面的方式即可。

SELECT dbms_sqltune.report_sql_detail(

sql_id => 'xxxx',

report_level => 'ALL',

type=>'ACTIVE',

start_time=>to_date('xxxx','yyyymmddhh24miss'),

duration=>'xxxx'

)

FROM dual;

 

 

扫雷环节
 

最后来扫几个雷。

 

对于TEXT,HTML格式的报告,这个对环境的依赖很低,对网络没有依赖,是非常稳定的实现,推荐使用。

 

对于SQL Monitor List报告,其实完全可以使用v$sql_monitor来得到,有些环境运行可能有下面的报错信息。

 

 

对于SQL Monitor的ACTIVE格式报告,在线方式还是推荐使用,离线查看可以先行下载脚本到本地。

 

如果报告显示的错误如下:

 

 

对于在线查看来说,可能是生成的报告格式的问题,看看是不是预先设置了这些选项。

set trimspool on trim on

set pages 0 linesize 1000

set long 1000000 longchunksize 1000000

 

对于离线查看可能就是下载的脚本路径问题了,调整一下即可。

 

对于SQL Monitor的更多定制
 

v$sql_monitor类似v$session的机制,某个SQL语句造成的问题已经发生了一段时间,想查看之前的执行情况,v$sql_monitor基本上就无从得知了,因为数据已经被刷出去了。

 

我们可以在后台启用一个JOB不定时的去查找,把这部分数据给缓存起来,比如是采用平面文件的形式来收集,然后通过时间戳来进行区别管理。

 

 

相信到此大家对于SQL Monitor有了一个简单的认识和理解,希望有所帮助。

 

作者介绍  杨建荣

  • DBAplus社群联合发起人。现就职于搜狐畅游,Oracle ACE-A、YEP成员,超7年数据库开发和运维经验,擅长电信数据业务、数据库迁移和性能调优。持Oracle 10G OCP,OCM,MySQL OCP认证,《Oracle DBA工作笔记》作者。
时间: 2024-12-29 23:25:57

掌握SQL Monitor这些特性,SQL优化将如有神助!的相关文章

被埋没的SQL优化利器——Oracle SQL monitor

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus).    据说,在Oracle企业版数据库中有一个免费的工具,乃SQL优化之利器,那就是Oracle SQL monitor.下面,由DBA+社群原创专家周俊,给大家科普一下这一被埋没的神器.   专家简介    周俊 DBA+社群原创专家   具有14年以上Oracle数据库技术支持经验,在IBM的7年间担任华东区非IBM logo产品技术支持团队team leader

【SQL】Oracle SQL monitor

[SQL]Oracle SQL monitor 第一章 被埋没的SQL优化利器--Oracle SQL monitor DBAplus社群 | 2015-11-26 07:00 转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus). 据说,在Oracle企业版数据库中有一个免费的工具,乃SQL优化之利器,那就是Oracle SQL monitor.下面,由DBA+社群原创专家周俊,给大家科普一下这一被埋没的神器. 周俊 D

掌握SQL Monitoring这些特性,SQL优化通通不在话下

目录 术语说明 概述 什么SQL会被SQL MONITORING监控到 找到Real Time SQL Monitoring入口 详解Real Time SQL Monitoring     1术语说明   在正式介绍Real Time SQL Monitoring之前,我们先对接下来要用到一些术语做集中的介绍.   Table Queue,消息缓冲区,在并行操作中使用,用于PX进程之间的通信,或者PX进程与QC进程之间的通信,是内存中的一些page,每个消息缓冲区的大小由参数parallel_

SQL Monitor,你值得掌握的一个特性

    对于线上的SQL语句,看着执行计划cost还不错,但是实际执行的时候效果却有千壤之别,这是为什么呢?     对于一个庞大的SQL语句,看着得到的执行计划却不知道瓶颈在哪里,SQL语句太复杂,但是执行计划更复杂,要读明白它掌握要领也不是一件容易的事情.     碰到很多朋友问我,怎么去读一个执行计划,这个无论说的怎么细,似乎都不是很容易去理解,语言描述,纯文字描述和图形的效果还是有很大的差别.     如果你在11g的版本中,SQL Monitor就是一个大大的福利,你值得掌握,如果你还

SQL Server数据库性能的优化

server|数据|数据库|性能|优化 编者按:数据库性能优化和数据库管理系统密切相关,不同的数据库管理系统在具体操作上有很大不同.继本报连续在2003年第48期.49期上刊登<Sybase数据库性能调优>和<Oracle服务器性能调整攻略>,分别讨论了Sybase和Oracle数据库管理系统以后,本期我们将具体介绍SQL Server数据库的性能优化方法. 数据库是企业信息的核心,其应用水平的高低直接影响到企业管理水平.选择了一个高性能的数据库产品不等于就有一个好的数据库应用系统

浅析SQL Server数据库的性能优化

在一个大型的数据库中,性能成为人们关注的焦点之一,如何让数据库高效有效的运行成为广大数据库管理人员和开发人员必须要考虑的问题.性能是一个应用或多个应用在相同的环境下运行时对效率的衡量.性能常用响应时间和工作效率来表示.响应时间是指完成一个任务花费的时间,可以从以下三方面来减少响应时间: · 减少竞争和等待的次数,尤其是磁盘读写等待次数 · 利用更快的部件 · 减少利用资源所需的时间 绝大多数性能的获得来自于优秀的数据库设计.精确的查询分析和适当的索引.最好性能的获得能够通过确立优秀的数据库设计,

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.5 执行计划中其他信息的含义

2.5 执行计划中其他信息的含义 通过DBMS_XPLAN输出执行计划,除了计划本身外,还可以获得一些其他信息帮助我们进一步分析执行计划及语句性能. 2.5.1 查询块和对象别名 在使用DBMS_XPLAN显示执行计划时,选择'ADVANCED'预定义格式作为参数或者加入'ALIAS'控制字符串,可以在输出中看到以下内容: Query Block Name / Object Alias (identified by operation id): -------------------------

MSSQL-应用案例-SQL Server 2016基于内存优化表的列存储索引分析Web Access Log

问题引入 在日常的网站运维工作中,我们需要对网站客户端访问情况做统计.汇总.分析和报表展示,以数据来全面掌控网站运营和访问情况.当不可预知的意外情况发生时,我们可以快速发现问题以及采取相应的措施.比如:当网站受到黑客攻击时的流量陡增,又或者是网站某个资源发生意外抛异常等情况. 在提供Web服务的服务器上,比如IIS.Apache都存在访问日志记录,这篇是文章是以SQL Server 2016基于内存优化表的列存储索引来分析Apache Web Access Log为例,讲解分析网站访问情况,因此

SQL Server 利用锁提示优化Row_number()-程序员需知

原文:SQL Server 利用锁提示优化Row_number()-程序员需知 网站中一些老页面仍采用Row_number类似的开窗函数进行分页处理,此时如果遭遇挖坟帖的情形可能就需要漫长的等待且消耗巨大.这里给大家介绍根据Row_number()特性采用特定锁Hint提升查询速度.   直接上菜   脚本环境可在SQL Server优化技巧之SQL Server中的"MapReduce"找到   如下查询在分页中比较常见 set statistics time on select *