使用多个子选择的效率

时间:2013-05-27 06:11:36

标签: subquery

我正在尝试为主帐户收集多个相关的数据并创建一个视图(例如,逾期余额,帐户余额,债务恢复状态,利息保留)。这种方法会有效吗?数据库平台是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

1 个答案:

答案 0 :(得分:0)

通常,对此的答案是应尽可能避免相关子查询。

使用它们将导致您的视图进行全表扫描,这很糟糕。您想要使用这样的子查询的唯一情况是,如果您可以将主选择的范围限制为仅几行,或者确实没有其他选择。

当您遇到这种情况时,您可能需要考虑在更新触发器上添加列并预先计算它们,而不是使用子查询。这将使您的数据库保存一个颠簸。