SQL中求和的多个连接的有效替代方法?

时间:2016-01-12 20:49:59

标签: sql performance postgresql

假设我有以下架构:

A ID,数字

B id,数字

ID id

并有一个查询返回我想要的内容,如下所示:

SELECT ids.id, Atotal.total, Btotal.total
FROM ids
LEFT JOIN (
    SELECT id, SUM(number) as total
    FROM A
    GROUP BY id
) Atotal
ON Atotal.id = ids.id
LEFT JOIN (
    SELECT id, SUM(number) as total
    FROM B
    GROUP BY id
) Btotal
ON Btotal.id = ids.id

即,我们会在 ids 中为每个ID返回A和B中每个ID的总和。

我知道这非常低效,但我的替代方案是什么,为什么/如何更有效率呢?

我觉得我可以在这里使用IN,但我不想继续使用它而不知道为什么它会更好,以及在多大程度上。我做了一些谷歌搜索,但找不到类似我的问题。

(另外,如果有任何好的材料可以帮助我提高SQL的效率,我们将非常感激!)

1 个答案:

答案 0 :(得分:0)

您的查询应该没问题。您可以将性能与子查询方法进行比较:

select i.id,
       (select sum(a.number) from A where a.id = i.id) as ATotal,
       (select sum(b.number) from B where b.id = i.id) as BTotal
from ids i;

特别感兴趣的是当A(id, number)B(id, number)上有索引时会发生什么。我不确定在Postgres中这是否更好,但在某些情况下,相关子查询在某些数据库中的表现更好。