【问题标题】:Improving performance of join on subselect提高子选择连接的性能
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 哦,哇。太简单了,不敢相信我错过了。谢谢!
  • 另外,据我了解,此实现将需要 GROUP BY 子句来包含两个表中的每一列(votes 除外),这有点难看,不适用于 @987654323 @.
  • @DavidChouinard 好吧,你想检索的每一列,是的。这不是“丑陋”(而select * 是),这是唯一的方法;):select 中不在聚合函数中的所有字段都必须在 group by 子句中。
  • 好吧,我说这很丑,因为有冗余信息,即。我们要检索的列列出了两次:在 SELECT 和 GROUP BY 子句中。剔除冗余数据是一个基本原则。但我明白,这与 SQL 的限制一样好。 :)
  • @DavidChouinard:我认为最新版本的 PG 让您摆脱了仅在 group by 语句中列出主键的情况,因为它是独一无二的。 (至少,在某个时候,关于 PG Hackers 有过关于这个话题的讨论。)
猜你喜欢
  • 2012-06-16
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多