如何加快此更新并设置?

时间:2017-09-07 01:52:48

标签: sql postgresql

我有两张桌子,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多个类似的查询要运行...所以我怎么能加快速度呢?我认为集合中的功能和杀死我的地方。

2 个答案:

答案 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)

你可以做的事情是:

  1. 确保主键(y列是第一列)到达表y.id
  2. 如果您没有任何空列,则可能不需要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)
  3. 在您确定y使用正确的主键后,您可以通过向update提供并行提示来制作x。例如,为了使用4个并行进程,update /*+ PARALLEL(x 4) */ x ...对于此步骤,请谨慎使用系统资源。
  4. 所以要把事情搞定,我建议的是;

    • “很多次”到达表格,即通过主键表y
    • 通过并行流程到达您进行全面扫描的表格,即表格x