最近遇到使用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秒,满足了用户的要求。其中主要是把查询分成两个部分,每个部分单独查询出来,然后再关联,这样的查询速度就快了,大家可以借鉴一下。