我有两张桌子,x和y
我创建了一个查询,用y.col_p列的总和更新x.col_p,它们都匹配特定的日期和ID。
UPDATE x
SET col_p = (
SELECT sum(col_p)
FROM y
WHERE concat(x.mmonth, x.dday, x.yyear) = (concat(y.mmonth, y.dday, y.yyear))
AND x.ID = y.ID
)
这样可以使用正确的值成功更新列,但执行需要15分钟,我还有40多个类似的查询要运行...所以我怎么能加快速度呢?我认为集合中的功能和杀死我的地方。
答案 0 :(得分:3)
我建议将查询编写为:
UPDATE x
SET col_p = (SELECT sum(col_p)
FROM y
WHERE x.yyear = y.yyear AND x.mmonth = y.mmonth AND
x.dday = y.dday AND x.ID = y.ID
);
然后确保您在y(ID, yyear, mmonth, dday, col_p)
上有索引。
答案 1 :(得分:1)
你可以做的事情是:
y
列是第一列)到达表y.id
。concat
。这就是为什么而不是concat(x.mmonth, x.dday, x.yyear) = (concat(y.mmonth, y.dday, y.yyear))
,尝试(x.mmonth, x.dday, x.yyear) = (y.mmonth, y.dday, y.yyear)
。y
使用正确的主键后,您可以通过向update
提供并行提示来制作x
。例如,为了使用4个并行进程,update /*+ PARALLEL(x 4) */ x ...
对于此步骤,请谨慎使用系统资源。 所以要把事情搞定,我建议的是;
y
x
。