[转帖]使用TOAD优化复杂SQL
独家秘笈!看下如何一键优化Oracle数据库复杂sql,DBA必备
https://www.toutiao.com/i6741208493644055053/ 原来toad 还有这种功能 感觉类似于 JAVA的 JIT编译 根据实际数据进行优化SQL 自己SQL功底太垃圾了。知道有TOAD这个功能 以后可以学习尝试一下。
概述
It is very easy for us to implement sql tuning by toad. We need to do is just give complex sql statement to toad.
相信很多朋友都会碰到那些几十行几百行的sql,像这种复杂的sql单单去做分析都很耗费我们的时间了,有没有一种办法可以一键优化这种复杂的sql语句呢?今天主要分享一下怎么通过toad工具去优化那些复杂的sql,目的是帮助我们减少优化的时间。
原始sql
SELECT mm.inst_id, mm.sid, mm.TYPE, mm.id1, mm.id2, LPAD (TRUNC (mm.ctime / 60 / 60), 3) || ' Hour ' || LPAD ( TO_CHAR ( TRUNC (mm.ctime / 60) - TRUNC (mm.ctime / 60 / 60) * 60, 'fm09'), 2) || ' Min ' || LPAD (TO_CHAR (mm.ctime - TRUNC (mm.ctime / 60) * 60, 'fm09'), 2) || ' Sec' ctime, CASE WHEN mm.block = 1 AND mm.lmode != 0 THEN 'holder' WHEN mm.block = 0 AND mm.request != 0 THEN 'waiter' ELSE NULL END role, CASE WHEN ee.blocking_session IS NOT NULL THEN 'waiting for SID ' || ee.blocking_session ELSE NULL END blocking_session, dd.sql_text sql_text, cc.event wait_event FROM gv$lock mm, gv$session ee, gv$sqlarea dd, gv$session_wait cc WHERE mm.sid IN (SELECT nn.sid FROM (SELECT tt.*, COUNT (1) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) cnt, MAX (tt.lmode) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) lmod_flag, MAX (tt.request) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) request_flag FROM gv$lock tt) nn WHERE nn.cnt > 1 AND nn.lmod_flag != 0 AND nn.request_flag != 0) AND mm.sid = ee.sid(+) AND ee.sql_id = dd.sql_id(+) AND mm.sid = cc.sid(+) AND ( (mm.block = 1 AND mm.lmode != 0) OR (mm.block = 0 AND mm.request != 0))ORDER BY mm.TYPE, mm.id1, mm.id2, mm.lmode DESC, mm.ctime DESC
1、Get execution plan
Editor --> Explain plan current SQL or CTRL + E
可以看到执行计划如下:
2、 Get statistics/Auto Trace
开启自动trace跟踪:
或者在sql编辑区右键选择去开启自动跟踪:
3、Get statistics after executed sql.
点击执行后可以看到sql相关统计信息:
4、 Tuning SQL
选择自动优化sql:
执行sql:
可以看到正在自动优化:
优化完成后如下:
5、 Compare result
这里我们可以看到其中一条sql从3.7秒优化到0.04秒
最终sql
SELECT /*+ NO_CPU_COSTING */ mm.inst_id, mm.sid, mm.TYPE, mm.id1, mm.id2, LPAD(TRUNC(mm.ctime / 60 / 60), 3) || ' Hour ' || LPAD(TO_CHAR(TRUNC(mm.ctime / 60) - TRUNC(mm.ctime / 60 / 60) * 60, 'fm09'), 2) || ' Min ' || LPAD(TO_CHAR(mm.ctime - TRUNC(mm.ctime / 60) * 60, 'fm09'), 2) || ' Sec' ctime, CASE WHEN mm.block = 1 AND mm.lmode != 0 THEN 'holder' WHEN mm.block = 0 AND mm.request != 0 THEN 'waiter' ELSE NULL END role, CASE WHEN ee.blocking_session IS NOT NULL THEN 'waiting for SID ' || ee.blocking_session ELSE NULL END blocking_session, dd.sql_text sql_text, cc.event wait_event FROM gv$lock mm, gv$session ee, gv$sqlarea dd, gv$session_wait cc WHERE EXISTS (SELECT 'X' FROM (SELECT tt.*, COUNT(1) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) cnt, MAX(tt.lmode) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) lmod_flag, MAX(tt.request) OVER (PARTITION BY tt.TYPE, tt.id1, tt.id2) request_flag FROM gv$lock tt) nn WHERE nn.cnt > 1 AND nn.lmod_flag != 0 AND nn.request_flag != 0 AND nn.sid = mm.sid) AND mm.sid = ee.sid (+) AND ee.sql_id = dd.sql_id (+) AND mm.sid = cc.sid (+) AND (mm.block = 1 AND mm.lmode <> 0 OR mm.block = 0 AND mm.request <> 0) ORDER BY mm.TYPE, mm.id1, mm.id2, mm.lmode DESC, mm.ctime DESC
虽然花上一些时间我们也可以优化到我们想要的结果,但是通过工具去帮助我们减少这些时间,何乐而不为呢?
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~
[转帖]使用TOAD优化复杂SQL的更多相关文章
- Oracle数据库该如何着手优化一个SQL
这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- Oracle性能优化之SQL语句
1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...
- 最有效地优化 Microsoft SQL Server 的性能
为了最有效地优化 Microsoft SQL Server 的性能,您必须明确当情况不断变化时,性能将在哪些方面得到最大程度的改进,并集中分析这些方面.否则,在这些问题上您可能花费大量的时间和精力 ...
- ORACLE性能优化之SQL语句优化
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1. SQL语句执行过程 2. 优化器及执行计划 3. 合 ...
- 整理:sql语句优化之SQL Server
. 增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存.使用并行还是串行程是MsSQL自动评估选择的.单个任务分解成多个任务,就可 以在处理器上运行.例如耽搁查询的排序.连接.扫描和 ...
- NewSQL——优化的SQL存储引擎(TokuDB, MemSQL)+?
NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性. NewSQL 是指这样一类新式的关系型数据库 ...
- 数据库的优化(表优化和sql语句优化)
在这里主要是分为表设计优化和sql语句优化两方面来实现. 首先的是表设计优化: 1.数据行的长度不要超过8020字节.如果是超过这个长度的话这条数据会占用两行,减低查询的效率. 2.能用数字类型就不要 ...
- Dynamics AX 2012 性能优化之 SQL Server 复制
Dynamics AX 2012 性能优化之 SQL Server 复制 分析数据滞后 在博文 Dynamics AX 2012 在BI分析中建立数据仓库的必要性 里,Reinhard 阐述了在 AX ...
随机推荐
- python一些实用的小工具
1 搭一个简易的本地局域网 python -m http.server 2 获取当前目录下的所有文件名 3 进度条效果 import sys,time for i in range(50): sy ...
- 从零开始实现SSD目标检测(pytorch)(一)
目录 从零开始实现SSD目标检测(pytorch) 第一章 相关概念概述 1.1 检测框表示 1.2 交并比 第二章 基础网络 2.1 基础网络 2.2 附加网络 第三章 先验框设计 3.1 引言 3 ...
- 【原创】go语言学习(二十)并发编程
目录 并发和并行 Goroutine初探 Goroutine实战 Goroutine原理浅析 Channel介绍 Waitgroup介绍 Workerpool的实现 并发和并行 1.概念A. 并发:同 ...
- aws使用之负载均衡elb要点
目录: 1.创建负载 2.目标群组 3.使用注意事项 4.总结 创建负载 alb负载 https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/la ...
- 【原创】go语言学习(三)字符串串、时间和日期类型
目录 1.字符串串原理理解析2. 时间类型3. 日期类型 字符串串原理理解析 1.字符串串底层就是⼀一个byte数组,所以可以和[]byte类型互相转换2.字符串串之中的字符是不不能修改的,那怎么修改 ...
- (转)libvirt和qemu编译安装
借鉴:https://www.cnblogs.com/grglym/p/8053553.html 借鉴:http://blog.chinaunix.net/uid-31410005-id-577189 ...
- 认识wsgi
WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...
- Java 面向对象(十四)
反射 反射是框架设计的灵魂 一.类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 :就是指将class文件读入内存,并为 ...
- 将bat文件注册成为系统服务
第一章 注册系统服务准备 1.1 注册系统服务前准备 1.1.1 涉及第三方软件 Bat_To_Exe_Converter.exe (将*.bat文件转化为可执行*.exe文件) insts ...
- Web前端笔记整理
不使用Ajax无刷新提交: header('HTTP/1.1 204 No Content'); var a=document.createElement('img'); a.setAttribute ...