閱讀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