【发布时间】:2016-12-22 21:09:56
【问题描述】:
我有两个问题。第一个从另一个表中检索一些聚合作为列,使用 select 中的子查询(返回所有行的列的字符串连接)。
第二个查询通过在 from 中进行子选择来执行相同的操作,然后加入结果。然而,第二个查询在加入之前对整个表进行聚合,但速度要快得多(286 毫秒对 7645 毫秒)。
我不明白为什么子查询慢得多,而第二个查询在一个有 175k 行的表上进行聚合(在 postgresql 9.5 上)。使用子选择更容易集成到查询构建器中,所以我想使用它,当记录数量增加时,第二个查询会变慢。有没有办法提高子选择的速度?
查询 1:
select kp_No,
(select string_agg(description,E'\n') from (select nt_Text as description from fgeNote where nt_kp_No=fgeContact.kp_No order by nt_No DESC limit 3) as subquery) as description
from fgeContact
where kp_k_No=729;
说明:https://explain.depesz.com/s/8sL
查询 2:
select kp_No, NoteSummary
from fgeContact
LEFT JOIN
(select nt_kp_No, string_agg(nt_Text,E'\n') as NoteSummary
from
(select nt_kp_No, nt_Text from fgeNote ORDER BY nt_No DESC) as sortquery
group by nt_kp_No) as joinquery
ON joinquery.nt_kp_No=kp_No
where kp_k_No=729;
【问题讨论】:
-
问这个问题就像“为什么把 12 个鸡蛋放在篮子里,一个人拿来比一个一个拿来更快”。因为篮子就是为此而生的,因为你只有两只手。等