提高subselect连接的性能

时间:2013-05-29 13:05:34

标签: sql performance postgresql database-performance

考虑此表(comments):

         id | post_id |      text
------------+---------|----------------
      79507 |     12  | Lorem Ipsum
      79544 |     12  | Foo, bar
      79545 |     14  | Interesting...

这个聚合查询:

SELECT comment_id, SUM(vote) AS votes
FROM votes 
GROUP BY comment_id;

 comment_id | votes 
------------+-------
      79507 |    3
      79544 |    4
      79545 |    1

我希望加入comments表和聚合查询,但只对一小部分数据感兴趣(只有特定的post_id)。这种天真的方法使用子查询来正确返回post_id 12的结果:

SELECT comment_id, votes, text FROM comments c LEFT JOIN
  (SELECT comment_id, SUM(votes) AS vote
   FROM votes 
   GROUP BY comment_id) AS v
ON c.id = v.comment_id 
WHERE c.post_id = 12;

 comment_id | votes |      text
------------+-------|----------------
      79507 |    3  | Lorem Ipsum
      79544 |    4  | Foo, bar

然而,这是非常低效的,因为我们在整个表上计算内部子查询,但我们只对它的一小部分感兴趣(此应用程序中的votes表很大)。 / p>

直观地说,似乎我们应该过滤内部查询,并且我们在子选择中缺少WHERE comment_id IN (...)。但是,我们不知道在计算的那个阶段我们需要哪个comment_id。 subselect中的另一个subselect可用于检索相应的comment_id s,但这看起来非常笨拙。

我对SQL缺乏经验,不确定是否存在更清晰的解决方案。也许子选择方法完全是错误的。

1 个答案:

答案 0 :(得分:3)

我不确定我是否理解,你不需要这样的东西吗?

SELECT c.id as comment_id, SUM (v.vote) as votes, c.text
FROM comments c
LEFT JOIN votes v ON c.id = v.comment_id
WHERE c.post_id = 12
GROUP BY c.id, c.text