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

时间:2022-05-03
本文章向大家介绍走在专家的路上,每天一条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倍。