select *
from (select sso.pk_org,
sso.pk_dept,
sso.pk_customer,
sso.vbillcode,
sso.payterm,
sso.ntotalmoney,
sso.origdepositmny,
sso.depositmny,
sso.deductrule,
sso.deviverymny,
sso.verifydeliverymny,
sso.depositbalance,
recbill.gatheringmny,
'1001A6100000000JYKK4' exchgtype
from v_depositloan_hkzh sso
left outer join (select /*+ index ( flow I_SO_ACCOUNTMNY_FLOW_REPORT ) */
sum(nvl(flow.nmny, 0)) +
sum(nvl(flow.nestarmny, 0)) +
sum(nvl(flow.narmny, 0)) -
sum(nvl(flow.nnoverifymny, 0)) gatheringmny,
flow.csaleorgid pk_org,
flow.cdeptid,
flow.ccustomerid,
flow.pk_org fir_dept
from so_accountmny_flow flow
where flow.dr = 0
and flow.csaleorgid is not null
and flow.cdeptid is not null
and flow.ccustomerid is not null
and flow.pk_org is not null
group by flow.csaleorgid,
flow.cdeptid,
flow.ccustomerid,
flow.pk_org) recbill
on recbill.fir_dept = sso.vdef94
and recbill.pk_org = sso.pk_org
and recbill.cdeptid = sso.pk_dept
and recbill.ccustomerid = sso.pk_customer) aa
where 1 = 1
上千万的数据进行左连接,这怎么也快不了吧......
对于硬件配置较好的oracle数据库来说,千万行真不是什么问题。
一段段拆开来看吧。
/*+parallel (flow,12) */
以上是单从逻辑上来分析,另外,oracle21c支持一些新特性,比如sql宏,可以让视图外的查询条件写到视图内的子查询中,但NC系统估计是不会用这个oracle版本的
我有两点疑问,从你的select * 来看,你的左连空值并没有任何处理,所以不知道你左连的意义是什么。如果可能的话,改成内连。
select
sso.pk_org,
sso.pk_dept,
sso.pk_customer,
sso.vbillcode,
sso.payterm,
sso.ntotalmoney,
sso.origdepositmny,
sso.depositmny,
sso.deductrule,
sso.deviverymny,
sso.verifydeliverymny,
sso.depositbalance,
sum(nvl(flow.nmny, 0)) + sum(nvl(flow.nestarmny, 0)) + sum(nvl(flow.narmny, 0)) - sum(nvl(flow.nnoverifymny, 0)) gatheringmny,
'1001A6100000000JYKK4' exchgtype
from
v_depositloan_hkzh sso,
so_accountmny_flow flow
where
flow.pk_org = sso.vdef94
and flow.csaleorgid = sso.pk_org
and flow.cdeptid = sso.pk_dept
and flow.ccustomerid = sso.pk_customer
group by
sso.pk_org,
sso.pk_dept,
sso.pk_customer,
sso.vbillcode,
sso.payterm,
sso.ntotalmoney,
sso.origdepositmny,
sso.depositmny,
sso.deductrule,
sso.deviverymny,
sso.verifydeliverymny,
sso.depositbalance
;