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