有关左链接与子查询的疑惑(求助)
做项目忙了一天,头昏脑胀,求助下大家帮忙看下两段SQL
Oracle 10G 版本
第一段
select ebpoE.zbthnr as zbthnr1,ebpoE.Zqgdh,
o.zbthnr2,
ebpoE.ebeln,
ebpoE.ebelp from t_sap_eban ebpoE
left join (
select eban.banfn,eban.bnfpo,decode(nvl(ekpo.ebeln_pre, ''),
'',
(select eb.zbthnr
from t_sap_eban eb
where eb.ebeln || '-' || eb.ebelp =
ekpo.konnr || '-' || ekpo.ktpnr
and
eb.loekz is null and rownum =1),
(select eb.zbthnr
from t_sap_eban eb
where eb.ebeln || '-' || eb.ebelp =
ekpo.ebeln_pre || '-' || ekpo.ebelp_pre
and
eb.loekz is null and rownum =1)) as zbthnr2
from t_sap_eban eban, t_sap_ekpo ekpo
WHERE nvl(eban.ebeln,'') || '-' ||nvl(eban.ebelp,'') =
ekpo.ebeln || '-' || ekpo.ebelp
) o
on o.banfn||'-'||o.bnfpo = ebpoE.banfn||'-'||ebpoE.bnfpo
where ebpoE.Ebeln = '4700038450'
第二段
select ebpoE.zbthnr as zbthnr1,ebpoE.Zqgdh,
(select decode(nvl(ekpo.ebeln_pre, ''),
'',
(select nvl(eb.zbthnr, '')
from t_sap_eban eb
where eb.ebeln || '-' || eb.ebelp =
ekpo.konnr || '-' || ekpo.ktpnr
and
eb.loekz is null and rownum =1),
(select nvl(eb.zbthnr, '')
from t_sap_eban eb
where eb.ebeln || '-' || eb.ebelp =
ekpo.ebeln_pre || '-' || ekpo.ebelp_pre
and
eb.loekz is null and rownum =1)) as zbthnr2
from t_sap_eban eban, t_sap_ekpo ekpo
WHERE eban.ebeln || '-' || eban.ebelp =
ekpo.ebeln || '-' || ekpo.ebelp
and eban.banfn|| '-' ||eban.bnfpo = ebpoE.banfn|| '-' ||ebpoE.bnfpo)
as zbthnr2,
ebpoE.ebeln,
ebpoE.ebelp
from t_sap_eban ebpoE where nvl(ebpoE.Ebeln,'') = '4700038450'
这两段SQL其实都是一个意思就是字段zbthnr2通过判断ekpo表相关的字段是否有值,如果没有值则执行一段逻辑判断获取一个值来作为该值
第一段的SQL是采用先将值取出然后通过条件左链接获得该值
第二段的SQL是采用子查询的方式获得zbthnr2该值
按照经验来说的话应该是第一段的SQL的执行时间会短一些。。
但是现在是这种情况,第一段SQL如果不加" where ebpoE.Ebeln = '4700038450' ",查询所有值为10秒
但是加了" where ebpoE.Ebeln = '4700038450' " 的话至少10分钟都出不来数据。
而第二段的SQL中 如果加了" where ebpoE.Ebeln = '4700038450' " 则查询对应值为20秒左右
如果不加则至少10分钟都出不来数据。
EBAN 中的主键为eban.banfn,eban.bnfpo 并且建立了eban.ebeln 与eban.ebelp相关索引
EKPO 中的主键为eban.ebeln 与eban.ebelp
请大虾们帮帮忙了
[解决办法]
加上条件之后,看解释计划有什么不同
[解决办法]
数据读取量太大?
也有可能解释计划本身就不对
重建相关索引试试?
