oracle innerjoin 特别慢,hsql数据量大的时候 left join 查询非常慢

最近遇到使用hsql查询两张表的时候,发现一旦left join就差些很慢,单独查很快,不知道为什么。

然后听说hsql只要数据量稍微大点,再 join一下就很慢,绞尽脑汁想到了一天终于想到办法了。

于是拆分sql把依然使用left join,但是事先把两个表的结果集变小就可以left join了。例子如下

select p.parent_id,

p.id,

p.pid,

p.c_name,

p.path,

p.params,

p.p_type,

p.area_code,

p.appid,

SUM(DECODE(a.name, 'cpu', convert(a.value,SQL_DOUBLE), NULL)) AS cpu,

SUM(DECODE(a.name, 'mem', convert(a.value,SQL_DOUBLE), 0)) AS mem

from  p

left join  a

on a.id = p.id

where  p.id = ?

优化后的sql

select * from (select p.parent_id,p.id,  p.pid, p.c_name, p.path, p.params, p.p_type,  p.area_code, p.appid, from ims_nw.process p where p.id=?) pp

left join (SELECT D.SUB_RES_ID ,

SUM(DECODE(D.NAME,'mem',convert(d.value,SQL_DOUBLE),NULL)) AS mem,

SUM(DECODE(D.NAME,'cpu',convert(d.value,SQL_DOUBLE),0)) AS cpu

FROM    D

WHERE  D.ID=?

GROUP BY D.ID) dd on pp.id=dd.ID

查询速度从原来的4秒变成了0.4秒,满足了用户的要求。其中主要是把查询分成两个部分,每个部分单独查询出来,然后再关联,这样的查询速度就快了,大家可以借鉴一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值