【发布时间】:2013-05-29 13:05:33
【问题描述】:
考虑一下这张表 (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 表很大)。
直观地说,我们似乎应该过滤内部查询,但我们在子选择中缺少WHERE comment_id IN (...)。但是,我们不知道在计算的那个阶段我们需要哪个comment_ids。子选择中的另一个子选择可用于检索适当的comment_ids,但这似乎很笨拙。
我对 SQL 缺乏经验,不确定是否存在更简洁的解决方案。也许子选择方法完全是错误的。
【问题讨论】:
-
您忘记声明您的 PostgreSQL 版本,这应该是给定的。
-
如果您使用的是当前版本的 Postgres,可能不需要冗余列出所有列。主键覆盖表的所有列。 Details in this related answer.
标签: sql performance postgresql database-performance