閱讀714 返回首頁    go 阿裏雲 go 技術社區[雲棲]


走在專家的路上,每天一條SQL優化(3)


image


本係列分享的SQL優化實例,並不一定適用於所有相似SQL或所有場景。我們隻是介紹一種方法,當你再次遇到類似SQL,可以根據真實場景,選擇最適合的方案。另外,有疑問的時候,最好的辦法就是測試,動手才能找到最佳答案!

SQL文本如下:


SELECT NVL(SUM(SRE), 0) HRJE
  FROM MD3U.CARD_INCOME A
 WHERE YLGRZHH = '371081110630214389'
   AND DDQCSRH IS NULL
   AND ZDLSH IS NOT NULL
   AND NVL(CGBZ, '0') = '1'
   AND NOTEXISTS (SELECT 'x'
         FROM MD3U.BILL_MID B
        WHERE B.ZDLSH = A.ZDLSH
          AND B.DM = 'hbry'
          AND B.C = '2')
   AND NOTEXISTS (SELECT 'x'
         FROM MD3U.BILL_MID C
        WHERE C.ZDLSH = A.ZDLSH
          AND C.DM = 'hrzh'
          AND C.C = '2');

執行計劃如下:


image

SQL統計信息如下:

image


索引相關信息如下:


image


從上麵可以看到,該SQL的總執行時間為111,452,436毫秒(ms)大概30.95小時(h),總執行次數為295,420次,平均一天執行26856次,從而可以判定也是一個使用非常頻繁的SQL查詢。因為執行次數比較多,所以總時間也非常大,但是單次執行時間並不是很長,隻有大概0.37秒(s)。這個SQL還可以進行優化。

優化前,文本執行後的執行計劃:


image


建議創建索引的SQL如下:


CREATE INDEX MD3U.idx_KC20_01 ON MD3U.KC20(AAE072,BKE021,BKE004) ONLINE;    
CREATE INDEX  MD3u.idx_KZ03_01 ON 
MD3U.KZ03(AAZ905,BKE163) GLOBAL ONLINE  ;

創建索引後,文本執行後的執行計劃:


image


可以看到優化後,執行時間從原來的0.01秒(s)變為0.01秒(s),邏輯讀從原來的82變為17,執行時間上性能沒有提高,但是邏輯讀減少大概4.8多倍。

原文發布時間為:2017-09-27
作者: 雲和恩墨
本文來自雲棲社區合作夥伴“數據和雲”,了解相關信息可以關注“數據和雲”微信公眾號

最後更新:2017-09-27 15:34:21

  上一篇:go  基於Hadoop大數據分析應用場景與實戰
  下一篇:go  智能語音質檢係統如何做到深度跟蹤分析客戶