我有一个表格可以保存用户对世界杯比赛的预测,每个预测都根据比赛的实际结果得分。所以我的表(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作为数据库。 感谢。
答案 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