2013-05-27 77 views
-1

我正在嘗試爲主賬戶收集多個相關數據並創建一個視圖(例如逾期餘額,賬戶餘額,債務恢復狀態,利息持有)。這種方法是否有效?數據庫平臺是Informix,Oracle和Sql Server。在Informix上做一些統計我只是對auubmast進行了1次連續掃描。我假設子選擇的效率很高,因爲它們會立即過濾到帳號。在完成之前,我可能需要很多子選擇。除了效率問題之外,還有其他「整潔」方法嗎?使用多個子查詢的效率

謝謝。

選擇 auubmast.acc_num, auubmast.cls_cde, auubmast.acc_typ,

(select 
sum(auubtrnh.trn_bal) 
from auubtrnh, aualtrcd 
where aualtrcd.trn_cde = auubtrnh.trn_cde 
and auubtrnh.acc_num = auubmast.acc_num 
and (auubtrnh.due_dte < current or aualtrcd.trn_typ = 'I')  
) as ovd_bal, 

(select 
sum(auubytdb.ytd_bal) 
from auubytdb, auubsvgr 
where auubytdb.acc_num = auubmast.acc_num 
and auubsvgr.svc_grp = auubmast.svc_grp 
and auubytdb.bil_yer = auubsvgr.bil_yer 
) as acc_bal, 

(select 
max(cur_stu) 
from audemast 
where mdu_acc = auubmast.acc_num 
and mdu_ref = 'UB' 
) as drc_stu, 

(select 
hol_typ 
from aualhold 
where mdu_acc = auubmast.acc_num 
and mdu_ref = 'UB' 
and pro_num = 2601 
and (hol_til is null or hol_til > current) 
) as int_hld 

從auubmast

回答

0

一般情況下,這個問題的答案是,相關子查詢應儘可能避免。

使用它們會導致您的視圖進行全表掃描,這很糟糕。你只需要這樣使用子查詢就是,如果你可以限制主選擇的範圍只有幾行,或者如果真的沒有其他選擇。

當您遇到類似情況時,您可能需要考慮添加列並在更新觸發器上預先計算它們,而不是使用子查詢。這將保存您的數據庫顛簸。

+0

感謝您的回答克萊頓。不知道爲什麼這被拒絕表示沒有研究 - 我研究並運行了各種不同風格的解釋。我也試圖找到其他類似的問題。有人建議這些類型的subquries像連接一樣並且無論如何都被索引 - 是否正確? – user2147475

+0

此外 - 逾期餘額實際上是'實時'的東西,所以在這種情況下觸發器將無濟於事。逾期確實需要來自交易餘額超過其到期日。我可以使用左外連接來獲取這種信息,但其中一些方法可能還需要工會來構建必要的值。 – user2147475