走在專家的路上,每天一條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倍。
原文發布時間為:2017-09-26
作者: 雲和恩墨
本文來自雲棲社區合作夥伴“數據和雲”,了解相關信息可以關注“數據和雲”微信公眾號
最後更新:2017-09-27 15:34:10