当前位置: 首页 > news >正文

Oracle SQL monitor

 

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

DBAplus社群 | 2015-11-26 07:00

转载声明:本文为DBA+社群原创文章,转载必须连同本订阅号二维码全文转载,并注明作者名字及来源:DBA+社群(dbaplus)。

据说,在Oracle企业版数据库中有一个免费的工具,乃SQL优化之利器,那就是Oracle SQL monitor。下面,由DBA+社群原创专家周俊,给大家科普一下这一被埋没的神器。

专家简介

wps2D38.tmp

周俊

DBA+社群原创专家

具有14年以上Oracle数据库技术支持经验,在IBM的7年间担任华东区非IBM logo产品技术支持团队team leader,同时是IBM中国区Oracle 软件支持服务的技术负责人。目前任职于Oracle公司,专注于Oracle数据集成方案设计和实施。获得Oracle 8i~11g OCP、Oracle 10g OCM、DB2 administrator、PMP等证书。

一前言

说实话,我以前也不太爱用花哨的图形界面工具进行SQL优化,最近参加了Oracle RWP培训,我发现Oracle 11g 引入的SQL monitor确实蛮好用的,是个被埋没的SQL优化利器。最重要的是Oracle SQL monitor在Oracle企业版数据库中是免费供大家使用的。下面我和大家分享如何利用SQL monitor简化我们的SQL优化工作。

二如何打开SQL monitor report

方法一

Step1:打开Oracle EM console主页,切换到性能页面,点击右下角的SQL监控。

wps2D39.tmp

wps2D49.tmp

Step2:选择 时间范围,可以按照持续时间或者数据库时间对SQL语句进行排序。

wps2D5A.tmp

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

当SQL并行执行时,会立即被实时监控到

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

使用/*+ monitor */提示的sql语句

Step3:选择您想要进行SQL优化语句前,点击第一列状态栏中勾号,Oracle就会将该SQL语句的执行情况华丽丽的展现在您面前。

wps2D5B.tmp

方法二

在性能页面左下角的顶级会话中,点击您想要查看的SQL语句ID。

wps2D6C.tmp

在SQL监控页面点击第一列状态栏中的图标。

wps2D7C.tmp

方法三

如果您没有配置Oracle EM,但是知道待优化SQL语句对应的SQLID,可以通过以下脚本利用SQL monitor查看SQL语句在数据库中真实的执行计划。

在SecureCRT中启用log跟踪,选择保存的日志文件(后缀html)

在SQLPLUS 中执行

set trimspool on

set arraysize 512

set trim on

set pagesize 0

set linesize 1000

set long 1000000

set longchunksize 1000000

spool sqlmon.html

select /*+ noparallel */ dbms_sqltune.report_sql_monitor (sql_id=>'input your SQL ID', report_level=>'ALL', type=>'ACTIVE') from dual;

spool off

cat sqlmon.html

在SecureCRT中关闭log跟踪,打开保存的文件就可以看到SQL执行计划了。

三如何利用SQL monitor进行SQL优化

使用SQL monitor打开SQL执行计划后,

我们通常会根据最右边CPU和wait的activity,找到SQL执行计划中资源消耗较高的步骤。

然后查看一下Oracle估算的返回行数和实际的返回行数是否相差很大,如果估算的行数和实际的行数相差不大,至少表明目前对应数据库对象上的统计信息是准确的。

本例中Oracle估算的返回行数和实际返回行数相差不大,Oracle优化器采用了布隆过滤和HASH 右连的执行计划,接下去我们通常会检查SQL的筛选条件,判断是否使用了正确的索引等优化手段,这里我就不一一展开了。

wps2D7D.tmp

wps2D8E.tmp

下面是我最近遇到的一个利用SQL monitor进行快速SQL优化的案例分享。

SQL Text:SQL语句比较长 ,我截选了其中部分有代表性的SQL。

wps2D9E.tmp

利用SQL monitor我们可以在执行计划中快速的定位需要重点关注的步骤。

wps2DAF.tmp

我们看到该SQL语句已经运行了5.4小时,Oracle估算的返回行数和实际行数相差非常大,表明相关表上的统计信息不准确。

我们对DMS_CONTAINERS和DMS_CONTAINER_JN表进行了统计信息收集,统计信息重新收集后Oracle马上使用了DMS_CONTAINER_JN表上正确的IYC_CNTRID字段的索引,但是DMS_CONTAINERS表上仍旧使用了选择度不高TYPE字段索引。

进一步查看SQL语句,我们发现该SQL是通过视图YMS_GUI_LOAD_CONTAINERS_VW访问DMS_CONTAINERS表,该视图的定义如下:

wps2DB0.tmp

由于在视图where条件中有IYC_TYPE字段,Oracle优先选用IYC_TYPE字段上的索引对DMS_CONTAINERS表进行访问,在CBO下,Oracle不会再去自动选择其他字段上单独的索引进行访问(除非手工设定AND-EQUAL提示),因此没有选择筛选度更高的YC_LSTUPDDT字段上的索引。 如果需要Oracle使用到其他字段上的索引,最简单的方法就是在IYC_TYPE和YC_LSTUPDDT字段上创建联合索引,Oracle在分析索引列的时候自动会分析两个列的组合情况,从而选择该复合索引。

wps2DC1.tmp

四总结

通过前面的介绍相信大家对Oracle SQL monitor华丽、直观的界面留下了深刻的印象,下面我再总结一下使用Oracle SQL monitor进行SQL优化的步骤:

通过SQL monitor监控我们可以快速地发现异常运行的SQL语句,如果您知道SQL对应的SQL ID也可以通过脚本利用SQL monitor查看SQL语句在数据库中真实的执行计划。

查看SQL执行计划,通过CPU和WAIT的活动比重快速找到SQL执行计划中的关键步骤。

通过比较Oracle估算的行数和实际返回行数能够快速判断是否需要重新收集统计信息,帮助我们分析Oracle优化器选择的SQL执行计划有无问题。

具体的SQL优化方法大家可以参考之前丁俊大师在DBA+社群分享过的Oracle SQL优化专题(关注DBA+社群微信公众号:dbaplus,回复“001”即可查看此文),我在这就不做进一步展开啦。

工欲善其事,必先利其器。小伙伴们,还等什么呢,赶紧去试试Oracle SQL monitor这个被埋没的SQL优化利器吧!

About Me

....................................................................................................................................................

本文来自于微信公众号转载文章,若有侵权,请联系小麦苗及时删除

ITPUB BLOG:http://blog.itpub.net/26736162

QQ:642808185 若加QQ请注明您所正在读的文章标题

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】

....................................................................................................................................................

转载于:https://www.cnblogs.com/lhrbest/articles/5388654.html

相关文章:

  • HTML 利用MAP创建图片中的链接的映射
  • CSS选择器(二)
  • 2016.04.14,英语,《Vocabulary Builder》Unit 14
  • 实验三 白盒测试
  • php 实现简单的登录
  • 一百多套开发视频教程的下载地址
  • jquery中attr和prop的区别
  • 利用qmake生成Makefile文件
  • 结对编程——关于Fault、Error、Failure程序设计
  • 流程控制
  • javascript之数组操作
  • Vmware复制或克隆Linux系统后找不到eth0的解决方案
  • Git(三):Git 使用规范流程
  • iOS之UI组件整理
  • StackExchange.Redis 访问封装类
  • php的引用
  • 自己简单写的 事件订阅机制
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • Java 23种设计模式 之单例模式 7种实现方式
  • KMP算法及优化
  • MySQL几个简单SQL的优化
  • node学习系列之简单文件上传
  • PHP 7 修改了什么呢 -- 2
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • redis学习笔记(三):列表、集合、有序集合
  • vue总结
  • Web设计流程优化:网页效果图设计新思路
  • 工作中总结前端开发流程--vue项目
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 1.Ext JS 建立web开发工程
  • 7行Python代码的人脸识别
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #android不同版本废弃api,新api。
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #NOIP 2014# day.2 T2 寻找道路
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2022 CVPR) Unbiased Teacher v2
  • (MATLAB)第五章-矩阵运算
  • (ZT)一个美国文科博士的YardLife
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)(官方)UE4--图像编程----着色器开发
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net IE10 _doPostBack 未定义
  • .NET 设计模式初探
  • .net(C#)中String.Format如何使用
  • .net访问oracle数据库性能问题
  • .NET命名规范和开发约定
  • .NET是什么
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)