走在专家的路上,每天一条SQL优化(2)

每天坚持进步一点点,让优秀成为一种习惯。

SQL文本如下:

INSERT INTO BPZONE.EI_ADDITION

  (EID,ROOTPIID, ANCESTOREID, CREATETIME)
 SELECT E.ID_, E.PROC_INST_ID_, '.' || E.ID_ || '.' ANCESTOREID, SYSDATE
 FROM ACTIVITI.ACT_RU_EXECUTION E
 WHERE E.ID_ = E.PROC_INST_ID_
    AND E.PARENT_ID_ IS NULL
    AND E.SUPER_EXEC_ IS NULL
 AND NOTEXISTS (SELECT 1 FROM BPZONE.EI_ADDITION B WHERE B.EID = E.ID_)
;

生成的执行计划如下:

SQL统计信息如下:

表及索引信息:

从上面可以看到,该SQL的总执行时间为63,737,806毫秒(ms)大概17.7小时(h),总执行次数为966次,平均一天执行87次,从而可以判定不是一个使用非常频繁的SQL查询。单次执行时间大概65. 98秒(s)。这个SQL可以进行优化。

优化前,查询部分执行后的执行计划:

建议创建索引的SQL如下:

CREATE INDEX ACTIVITI.idx_ACT_RU_EXECUTION_01 ON ACTIVITI.ACT_RU_EXECUTION(ID_,PROC_INST_ID_,PARENT_ID_,SUPER_EXEC_) ONLINE ;

建议SQL中的查询部分改写为如下形式:

 SELECT E.ID_, E.PROC_INST_ID_, '.' || E.ID_ || '.' ANCESTOREID, SYSDATE
   FROM ACTIVITI.ACT_RU_EXECUTION E
 WHERE E.ID_ = E.PROC_INST_ID_
     AND E.PARENT_ID_ IS NULL
 AND E.SUPER_EXEC_ IS NULL
 AND NOTEXISTS (SELECT  /*+ UNNEST HASH_AJ */ 1 FROM BPZONE.EI_ADDITION B WHERE B.EID = E.ID_);

修改后,文本执行后的执行计划:

可以看到优化后,执行时间从原来的65.98秒(s)变为0.02秒(s),逻辑读从原来的4177变为57,执行时间上性能提高大概3200多倍,逻辑读减少大概73倍。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序猿

SQL 注入语句特征

语句特征 1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass passwor...

534110
来自专栏SpringBoot

mybatis 批量更新问题

41410
来自专栏散尽浮华

Mysql更换MyISAM存储引擎为Innodb的操作记录

一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件。 通过下面的命令结果可知,已经安装了innod...

31990
来自专栏Aloys的开发之路

oracle表空间表分区详解及oracle表分区查询使用方法(转+整理)

此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念 2.表分区的具体作用 3.表分区的优缺点 4.表分区的几种类型及操作方法 5...

59090
来自专栏james大数据架构

SQL SERVER 内存分配及常见内存问题 DMV查询

内存动态管理视图(DMV):   从sys.dm_os_memory_clerks开始。 SELECT  [type] ,   SUM(virtual_mem...

217100
来自专栏乐沙弥的世界

SQLserver 存储过程执行错误记录到表

7410
来自专栏技术博文

MySQL SHOW PROFILE(剖析报告)的查看

前言:SHOW PROFIL命令是MySQL提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量。 一、参数的开启和关闭设置 1.1 参...

34430
来自专栏王磊的博客

常用Sql整理笔记

一、多行结果转换为一行,用逗号隔开。 mssql代码如下: -- 多行 select tid from typeinfo where pid=4 -- 一行 s...

43070
来自专栏杨建荣的学习笔记

浅谈exp/imp(上) (r5笔记第81天)

作为DBA,经常需要在不同数据库环境间做数据的导入导出,exp/imp就是这样的轻便快捷的客户端工具,可以很方便的在不同数据库之间转移数据对象,即使数据库位于不...

30580
来自专栏数据和云

【动手实践】Oracle 12.2新特性:多列列表分区和外部表分区

在Oracle 12.2版本中,增加了大量的分区新特性,这其中包括: 自动的列表分区创建 在线的普通表转换分区表 支持只读分区和读写分区混合 以下介绍的三个特...

33650

扫码关注云+社区

领取腾讯云代金券