oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配
需求
有兩個(gè)不同的表,A表是基礎(chǔ)數(shù)據(jù),B表根據(jù)A表的某個(gè)不重復(fù)關(guān)鍵字加其他一些條件查詢出一條或幾條數(shù)據(jù),取其中一條數(shù)據(jù)。并且利用此數(shù)據(jù)某個(gè)關(guān)鍵字再在B表中查詢下一層級數(shù)據(jù),最終將A表的對應(yīng)一條數(shù)據(jù),B表查詢出的兩條數(shù)據(jù)拼成一條數(shù)據(jù)返回。
由于這個(gè)聯(lián)合查詢的結(jié)果用的頻次與量都很大,所以做成了view,一開始是使用function來控制leftjoin條件篩選數(shù)據(jù)與匹配。但是若是把function作為條件,整個(gè)sql語句的查詢效率很差,在每次執(zhí)行查詢都需要3s左右。對系統(tǒng)的運(yùn)行速度與穩(wěn)定行都產(chǎn)生了一定的影響。
解決方案
在優(yōu)化中考慮的就是去除sql中的function,但是在function中可以很方便的進(jìn)行判斷與錯(cuò)誤處理,可以避免由于數(shù)據(jù)問題導(dǎo)致整個(gè)view無法使用。將function改成sql就要考慮到數(shù)據(jù)多或少的情況下如何保證準(zhǔn)確性。由于業(yè)務(wù)要求可以滿足,所以最終的sql中A表只執(zhí)行匹配0條或者1條B表中的數(shù)據(jù)。
最終代碼如下
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函數(shù)保證取出的數(shù)據(jù)不超過一條,再利用對應(yīng)條件與left join替代function的功能。
結(jié)果
在使用了替代方案后,整體查詢時(shí)間在0.1s到0.2s中,相對于原本3s有了很大的提升,當(dāng)然,此方法仍有優(yōu)化的空間,哪位有更好的方法也請不吝賜教。
總結(jié)
以上是生活随笔為你收集整理的oracle使用max提升效率,Oracle调优之利用max与leftjoin来进行不同表之间匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle sql 输出,将数据从Or
- 下一篇: oracle 创建日志文件,oracle