走在专家的路上,每天一条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 条评论
登录 后参与评论

相关文章

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

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

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

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

关于pl/sql中的绑定变量(r3笔记第73天)

在看关于shared pool的文档时,必定会提到绑定变量,也能够通过几个简单的例子对绑定变量带来影响有深刻的认识,但是在工作中,可能有时候我们就忘了绑定变量的...

2654
来自专栏程序猿

SQL 注入语句特征

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

44611
来自专栏james大数据架构

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

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

19910
来自专栏Java帮帮-微信公众号-技术文章全总结

【数据库】MySQL进阶一、主外键讲解

MySQL进阶主外键讲解 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可...

3547
来自专栏乐沙弥的世界

SQL基础-->数据库事务(TRANSACTION)

数据库事务是指作为单个逻辑工作单元执行的一系列操作,可以认为事务就是一组不可分割的SQL语句

813
来自专栏SpringBoot

mybatis 批量更新问题

2491
来自专栏乐沙弥的世界

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

621
来自专栏跟着阿笨一起玩NET

SQLServer中使用索引视图(物化视图)

物化视图:以前用的普通的视图,普通视图就是一段逻辑语句,对性能没有任何的提升,也不能创建索引,而物化视图会把视图里查询出来的数据在数据库上建立快照,它和物理表一...

1151
来自专栏王磊的博客

常用Sql整理笔记

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

4177

扫码关注云+社区