阅读683 返回首页    go 阿里云 go 技术社区[云栖]


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


image


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

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_)
;


生成的执行计划如下:


image


SQL统计信息如下:


image


表及索引信息:


image


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

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


image


建议创建索引的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_);

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


image

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

原文发布时间为:2017-09-26
作者: 云和恩墨
本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

最后更新:2017-09-27 15:34:10

  上一篇:go  如何做到 Laravel 配置可以网站后台配置?
  下一篇:go  走在专家的路上,每天优化一条SQL