Oracle調優之利用max與leftjoin來進行不一樣表之間匹配

需求

有兩個不一樣的表,A表是基礎數據,B表根據A表的某個不重複關鍵字加其餘一些條件查詢出一條或幾條數據,取其中一條數據。而且利用此數據某個關鍵字再在B表中查詢下一層級數據,最終將A表的對應一條數據,B表查詢出的兩條數據拼成一條數據返回。sql

因爲這個聯合查詢的結果用的頻次與量都很大,因此作成了view,一開始是使用function來控制leftjoin條件篩選數據與匹配。可是如果把function做爲條件,整個sql語句的查詢效率不好,在每次執行查詢都須要3s左右。對系統的運行速度與穩定行都產生了必定的影響。bash

解決方案

在優化中考慮的就是去除sql中的function,可是在function中能夠很方便的進行判斷與錯誤處理,能夠避免因爲數據問題致使整個view沒法使用。將function改爲sql就要考慮到數據多或少的狀況下如何保證準確性。因爲業務要求能夠知足,因此最終的sql中A表只執行匹配0條或者1條B表中的數據。 最終代碼以下函數

CREATE OR REPLACE VIEW ERP_MPS_PROCESS AS
SELECT distinct *
  FROM SAP_ITEM_DIE T              --A表
  left join (select h.parent_code,
                    max(h.component_code) as component_code,
                    h.werks,
                    h.stktx
               from ERP_BOM h      --B表
               left join erp_product_details j
                 on h.component_code = j.item_code
                and h.werks = j.dept_code
              where j.material_type = 'Z350'
              group by h.parent_code, h.werks, h.stktx) k
    on k.parent_code = T.MTNR1
   and k.stktx = t.equnr
  left join (select m.parent_code, max(m.component_code) as refcode
               from ERP_BOM m     --B表第二次取值
               left join erp_product_details n
                 on m.component_code = n.item_code
                and m.werks = n.dept_code
              where n.material_type = 'Z300'
              group by m.parent_code) o
    on o.parent_code = k.component_code
;
複製代碼

利用max函數保證取出的數據不超過一條,再利用對應條件與left join替代function的功能。優化

結果

在使用了替代方案後,總體查詢時間在0.1s到0.2s中,相對於本來3s有了很大的提高,固然,此方法仍有優化的空間,哪位有更好的方法也請不吝賜教。ui

相關文章
相關標籤/搜索