独家秘笈!看下如何一键优化Oracle数据库复杂sql,DBA必备

https://www.toutiao.com/i6741208493644055053/

原来toad 还有这种功能 感觉类似于 JAVA的 JIT编译 根据实际数据进行优化SQL

自己SQL功底太垃圾了。知道有TOAD这个功能 以后可以学习尝试一下。 
原创 波波说运维 2019-09-30 00:03:00

概述

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的更多相关文章

  1. Oracle数据库该如何着手优化一个SQL

    这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

  2. SQL Server数据库性能优化之SQL语句篇【转】

    SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...

  3. Oracle性能优化之SQL语句

    1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  4. 最有效地优化 Microsoft SQL Server 的性能

      为了最有效地优化 Microsoft SQL Server 的性能,您必须明确当情况不断变化时,性能将在哪些方面得到最大程度的改进,并集中分析这些方面.否则,在这些问题上您可能花费大量的时间和精力 ...

  5. ORACLE性能优化之SQL语句优化

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合 ...

  6. 整理:sql语句优化之SQL Server

    . 增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存.使用并行还是串行程是MsSQL自动评估选择的.单个任务分解成多个任务,就可 以在处理器上运行.例如耽搁查询的排序.连接.扫描和 ...

  7. NewSQL——优化的SQL存储引擎(TokuDB, MemSQL)+?

    NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性. NewSQL 是指这样一类新式的关系型数据库 ...

  8. 数据库的优化(表优化和sql语句优化)

    在这里主要是分为表设计优化和sql语句优化两方面来实现. 首先的是表设计优化: 1.数据行的长度不要超过8020字节.如果是超过这个长度的话这条数据会占用两行,减低查询的效率. 2.能用数字类型就不要 ...

  9. Dynamics AX 2012 性能优化之 SQL Server 复制

    Dynamics AX 2012 性能优化之 SQL Server 复制 分析数据滞后 在博文 Dynamics AX 2012 在BI分析中建立数据仓库的必要性 里,Reinhard 阐述了在 AX ...

随机推荐

  1. leetcode 198 动态规划

    题目意思是:给一组数组,要使选取的子数组和(不用连续)最大,但不能同时选取相邻. 我的思路: 对于a[i]来说,要么选取,要么不选取.假设选取a[i],那么肯定不能选取a[i-1],只能看前0~i-2 ...

  2. kaptcha 配置

    问题所在: 这一段配置,不要写在 SpringMVC 文件中,要写在 Spring 配置文件! <!-- kaptcha 验证码 --> <bean id="captcha ...

  3. 提高python运行效率的方法

    让关键代码依赖于外部包:你可以为紧急的任务使用C.C++或机器语言编写的外部包,这样可以提高应用程序的性能 使用生成器,因为可以节约大量内存 多个if elif条件判断,可以把最有可能先发生的条件放到 ...

  4. Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'

    code: 将 Stu* pStu = malloc(sizeof(Stu)); 改为Stu* pStu = (Stu*)malloc(sizeof(Stu)); code #include < ...

  5. 小程序开发--API之登录授权逻辑

    小程序登录授权获取逻辑 原生的小程序提供许多开放接口供使用者开发,快速建立小程序内的用户体系. 下面将小程序校验.登录.授权.获取用户信息诸多接口串联起来,以便更直观的认识到这些接口是如何在实际应用中 ...

  6. JS JQuery 操作: Json转 Excel 下载文件

    方法的调用 var json = '[' + '{"申请流水号":"123456","保险公司":"测试数据",&quo ...

  7. hive tez调优(3)

    根据.方案最右侧一栏是一个8G VM的分配方案,方案预留1-2G的内存给操作系统,分配4G给Yarn/MapReduce,当然也包括了HIVE,剩余的2-3G是在需要使用HBase时预留给HBase的 ...

  8. vue实现element-ui对话框可拖拽功能

    element-ui对话框可拖拽及边界处理 应业务需求,需要实现对话框可拖拽问题,应element-ui没有提供官方支持,于是便参考大神的文章,得出了适合业务需要的解决方案.很多大神给出的代码是没有解 ...

  9. kafka简介&使用

    架构 几个角色概念 broker 缓存代理,Kafa集群中的一台或多台服务器统称为broker.kafka集群有多个kafka实例组成,每个实例(server)成为broker.每个类型的消息被定义为 ...

  10. 使用HttpClient调用WebAPI接口,含WebAPI端示例

    API端: using log4net; using System; using System.Collections.Generic; using System.IO; using System.L ...