本文共 1173 字,大约阅读时间需要 3 分钟。
每天坚持进步一点点,让优秀成为一种习惯。
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倍。
原文发布时间为:2017-09-26
作者: 云和恩墨 本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号转载地址:http://sjanx.baihongyu.com/