调整查询以更新许多用户中的每一个的总和

时间:2014-06-17 10:53:09

标签: sql postgresql

我有一个表格可以保存用户对世界杯比赛的预测,每个预测都根据比赛的实际结果得分。所以我的表(worldcup_prediction)有user_id和predic_score。我想更新worldcup_user表中的用户总分,并通过每个预测分数的总和来计算。 所以我对此的质询是:

UPDATE worldcup_user
SET score = COALESCE((
            SELECT sum(predic_score)
            FROM worldcup_prediction
            WHERE user_id = worldcup_user.user_id
            ), 0)

但是这个查询需要花费很多时间(usersCount * 0.01秒),对于50000个用户来说,它很多。 有没有办法优化这个查询? 我使用PostgreSQL作为数据库。 感谢。

2 个答案:

答案 0 :(得分:1)

提前尝试进行计算并加入结果:

UPDATE worldcup_user
    SET score = COALESCE(ups.pscore, 0)
    FROM worldcup_user LEFT JOIN
         (SELECT user_id, sum(predic_score) as pscore
          FROM worldcup_prediction
          GROUP BY user_id
         ) ups
         ON ups.user_id = worldcup_user.user_id;

一个简单的复合索引也可能会修复第一个查询的性能。你会尝试这个索引:

create index idx_worldcup_prediction_2 on workcup_prediction(user_id, predic_score);

答案 1 :(得分:1)

好了,现在您正在为表中的每个用户运行SELECT语句。

我认为如果您运行一次SELECT SUM()查询,然后使用相应的值更新每个用户(在JOIN查询之间使用SELECT SUM,则会减少执行时间和worldcup_user表)

类似的东西:

UPDATE wu
SET wu.score = wp.score
FROM
worldcup_user wu INNER JOIN 
    (SELECT COALESCE(SUM(predic_score), 0) AS 'Score', user_id
     FROM worldcup_prediction
     GROUP BY user_id) wp 
    ON wu.user_id = wp.user_id